# 图和Neo4j


<!--more-->

## 1. 图论

- 起源

  众所周知，图论起源于一个非常经典的问题——柯尼斯堡（Konigsberg）七桥问题。1738年，瑞典数学家欧拉(LeornhardEuler)解决了柯尼斯堡七桥问题。由此图论诞生，欧拉也成为图论的创始人。

  欧拉把问题的实质归于"一笔画"问题，即判断一个图是否能够遍历完所有的边(Edge)而没有重复，而柯尼斯堡七桥问题则是一笔画问题的一个具体情境。欧拉证明这个问题不成立。

  满足一笔画的图满足两个条件: **图必须是一个完整图**;  **有零个或二个奇数点**

- 图和节点

  图是一组节点和连接这些节点的关系组成。图形数据存储在节点和关系所在的属性上。属性是键值对表示的数据。

  在图形理论中，我们可以**使用圆表示一个节点**并且可以向里面添加键值对形式的数据。![img](https://img.zhaojq.top/20260727091847454.png "img")

- 节点关系表达

  - 简单关系表达

    ![img_1](https://img.zhaojq.top/20260727091847626.png "img_1")

    此处在两个节点之间创建关系名称“跟随”。这意味着Proﬁle1跟随Proﬁle2。

  - 复杂关系表达

    ![img_2](https://img.zhaojq.top/20260727091847793.png "img_2")

    这里节点用关系连接。关系是单向或双向的。

- 属性图模型规则

  ![img_3](https://img.zhaojq.top/20260727091848059.png "img_3")

  ```
  图表示节点，关系和属性中的数据
  节点和关系都包含属性
  关系连接节点
  属性是键值对
  节点用圆圈表示，关系用方向键表示。
  关系具有方向：单向和双向。
  每个关系包含“开始节点”或“从节点”和“到节点”或“结束节点” 
  ```

## 2. 知识图谱和图库

- 知识图谱

  一种基于图的数据结构，由节点(Node)和边(Edge)组成。其中节点即实体，由一个全局唯一的ID标示，边就是关系用于连接两个节点。通俗地讲，知识图谱就是把所有不同种类的信息（Heterogeneous Information）连接在一起而得到的一个关系网络。知识图谱提供了从“关系”的角度去分析问题的能力。

  互联网、大数据的背景下，谷歌、百度、搜狗等搜索引擎纷纷基于该背景，创建自己的知识图谱KnowledgeGraph（谷歌）、知心（百度）和知立方（搜狗），主要用于改进搜索质量。

- 图数据库

  一般情况下，我们使用数据库查找事物间的联系的时候，只需要短程关系的查询（两层以内的关联）。当需要进行更长程的，更广范围的关系查询时，就需要图数据库的功能。而随着社交、电商、金融、零售、物联网等行业的快速发展，现实世界的事物之间织起了一张巨大复杂的关系网，传统数据库面对这样复杂关系往往束手无策。因此，图数据库应运而生。

  图数据库(Graphdatabase)指的是以图数据结构的形式来存储和查询数据的数据库。

  知识图谱中，知识的组织形式采用的就是图结构，所以非常适合用图库进行存储。

- 图形数据库优势

  在需要表示多对多关系时，我们常常需要创建一个关联表来记录不同实体的多对多关系。如果两个实体之间拥有多种关系，那么我们就需要在它们之间创建多个关联表。而在一个图形数据库中，我们只需要标明两者之间存在着不同的关系。如果希望在两个结点集间建立双向关系，我们就需要为每个方向定义一个关系。也就是说，相对于关系型数据库中的各种关联表，图形数据库中的关系可以通过关系属性这一功能来提供更为丰富的关系展现方式。因此相较于关系型数据库，图形数据库的用户在对现实进行抽象时将拥有一个额外的武器，那就是丰富的关系。

  ![img_4](https://img.zhaojq.top/20260727091848240.png "img_4")

  ```
  优势: 
  性能好,对长程关系的查询快; 
  擅于发现隐藏的关系,例如通过判断图上两点之间有没有走的通的路径,就可以发现事物间的关联
  ```

## 3. Neo4j基础

### 3.1 介绍

Neo4j是一个开源的无Shcema的 基于java开发的 图形数据库，它将结构化数据存储在图中而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。程序数据是在一个面向对象的、灵活的网络结构下，而不是严格、静态的表中,但可以享受到具备完全的事务特性、企业级的数据库的所有好处。https://db-engines.com/en/ranking

### 3.2 模块构建

- 节点

  节点是图表的基本单位。 它包含具有键值对的属性

- 属性

  属性是用于描述图节点和关系的键值对, key为字符串, value为任何neo4j数据类型

- 关系

  连接两个节点: ![img_5](https://img.zhaojq.top/20260727091848522.png "img_5")

  > 这里Emp和Dept是两个不同的节点。“WORKS_FOR”是Emp和Dept节点之间的关系。
  >
  > 因为它表示从Emp到Dept的箭头标记，那么这种关系描述: Emp WORKS_FOR Dept 
  >
  > 每个关系包含一个起始节点和一个结束节点。这里“Emp”是一个起始节点。“Dept”是端节点。
  >
  > 由于该关系箭头标记表示从“Emp”节点到“Dept”节点的关系，该关系被称为“进入关系”到“Dept”节点。并且“外向关系”到“Emp”节点。像节点一样，关系也可以包含属性作为键值对。

- 标签

  Label将一个公共名称与一组节点或关系相关联。节点或关系可以包含一个或多个标签。我们可以为现有节点或关系创建新标签。我们可以从现有节点或关系中删除现有标签。

  从前面的图中，我们可以观察到有两个节点。左侧节点都有一个标签：“EMP”，而右侧节点都有一个标签：“Dept”。这两个节点之间的关系，也有一个标签：“WORKS_FOR”

  注：Neo4j将数据存储在节点或关系的属性中。

### 3.3 Neo4j的主要应用场景

- 社交媒体和社交网络

  当使用图形数据库为社交网络应用程序提供动力时，可以轻松利用社交关系或根据活动推断关系。
  查询社区聚类分析，朋友的朋友推荐，影响者分析，共享和协作关系分析等

- 推荐引擎和产品推荐系统

  图形驱动的推荐引擎通过实时利用多种连接，帮助公司个性化产品，内容和服务。
  内容和媒体推荐，图形辅助搜索引擎，产品推荐，专业网络，社会推荐。

- 身份和访问管理

  使用图形数据库进行身份和访问管理时，可以快速有效地跟踪用户，资产，关系和授权。
  查询访问管理，资产来源，数据所有权，身份管理，互连组织，主数据，资源授权

- 金融反欺诈多维关联分析场景

  通过图分析可以清楚地知道洗钱网络及相关嫌疑，例如对用户所使用的帐号、发生交易时的IP地址、MAC地址、手机IMEI号等进行关联分析。

### 3.4 Neo4j环境搭建

linux下安装

- 下载安装包

  ```shell
  wget https://neo4j.com/artifact.php?name=neo4j-community-3.5.17-unix.tar.gz 
  
  # 也可去官网下载最新版
  ```

- 解压

- 修改配置文件

  conf/neo4j.conf

  ```
  # 主要是修改允许远程访问的地址把对应的注释打开即可
  dbms.connectors.default_listen_address=0.0.0.0 
  ```

- 开放对应的端口

  默认要开放7474和7687

  ```shell
  ﬁrewall-cmd--zone=public--add-port=7474/tcp--permanent 
  ﬁrewall-cmd--zone=public--add-port=7687/tcp--permanent 
  systemctl reload ﬁrewalld 
  或者直接将防火墙关闭
  systemctl stop firewalld.service 
  ```

- 启动

  `./bin/neo4jstart `

- 使用浏览器访问

  `http://ip:7474` 默认账号/密码: neo4j/neo4j

### 3.5 Neo4j数据浏览器

- 数据浏览器访问

  安装完就可以通过 http://ip:7474访问

  > Neo4j数据浏览器用于执行CQL命令并查看输出输出。
  >
  > 这里我们需要在美元提示符处执行所有CQL命令：“$” 如CREATE(cc:CreditCard)
  >
  > 在美元符号后键入命令，然后单击“执行”按钮运行命令。
  >
  > 它与Neo4j数据库服务器交互，检索和显示下面的结果到那个美元提示。
  >
  > 使用“VI视图”按钮以图形格式查看结果。

- 导出csv或者json




















