1.图论

1.1 图论起源—-柯尼斯堡(Konigsberg)七桥问题

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

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

  • 图必须是一个完整图
  • 有零个或二个奇数点

    1.2 图 和 节点

    图是一组节点和连接这些节点的关系组成。图形数据存储在节点和关系所在的属性上。属性是键值对表示的数据。
    在图形理论中,我们可以使用圆表示一个节点 并且可以向里面添加键值对形式的数据。
    image.png

1.3 节点关系表达

简单关系表达
image.png
此处在两个节点之间创建关系名称“跟随”。 这意味着Profifile1跟随Profifile2。
复杂关系表达
image.png
这里节点用关系连接。 关系是单向或双向的。

  • 从ABC和XYZ的关系是单向关系。
  • 从ABC和PQR的关系是双向关系。

1.4属性图模型规则
image.png

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

2.知识图谱和图库

2.1知识图谱

一种基于图的数据结构,由节点(Node)和边(Edge)组成。其中节点即实体,由一个全局唯一的ID标示,边就是关系用于连接两个节点。通俗地讲,知识图谱就是把所有不同种类的信息(Heterogeneous Information)连接在一起而得到的一个关系网络。知识图谱提供了从“关系”的角度去分析问题的能力。互联网、大数据的背景下,谷歌、百度、搜狗等搜索引擎纷纷基于该背景,创建自己的知识图谱Knowledge Graph(谷歌)、知心(百度)和知立方(搜狗),主要用于改进搜索质量。

2.2图数据库

一般情况下,我们使用数据库查找事物间的联系的时候,只需要短程关系的查询(两层以内的关联)。当需要进行更长程的,更广范围的关系查询时,就需要图数据库的功能。而随着社交、电商、金融、零售、物联网等行业的快速发展,现实世界的事物之间织起了一张巨大复杂的关系网,传统数据库面对这样复杂关系往往束手无策。因此,图数据库应运而生。图数据库(Graph database)指的是以图数据结构的形式来存储和查询数据的数据库。知识图谱中,知识的组织形式采用的就是图结构,所以非常适合用图库进行存储。

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

优势总结:

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

3. Neo4j基础

3.1什么是Neo4j

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

https://db-engines.com/en/ranking

3.2 Neo4j模块构建

Neo4j主要构建块

  • 节点
  • 属性
  • 关系
  • 标签
  • 数据浏览器

节点
节点是图表的基本单位。 它包含具有键值对的属性
属性
属性是用于描述图节点和关系的键值对
Key =值
其中Key是一个字符串
值可以通过使用任何Neo4j数据类型来表示
关系
关系是图形数据库的另一个主要构建块。 它连接两个节点,如下所示。
image.png
这里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环境搭建

Neo4j环境Linux下搭建
(1).切换到Linux下 到安装目录neo4j上传安装包 或者 下载安装包
使用ftp工具上传neo4j-community-3.5.17.tar到liunx下
或者wget https://neo4j.com/artifact.php?name=neo4j-community-3.5.17-unix.tar.gz
(2).解压
tar -xvf neo4j-community-3.5.17.tar
(3).修改配置文件neo4j.conf
vi conf/neo4j.conf
主要是修改 允许远程访问的地址 把对应的注释打开即可
dbms.connectors.default_listen_address=0.0.0.0
(4).开放对应的访问端口 默认要开放7474和7687
firewall-cmd --zone=public --add-port=7474/tcp --permanent firewall-cmd --zone=public --add-port=7687/tcp --permanent systemctl reload fifirewalld
(5).启动
./bin/neo4j start
(6).使用浏览器 访问服务器上的neo4j
http://192.168.211.133:7474
默认的账号是neo4j 密码neo4j 这里第一次登录的话会要求修改密码

Windows下的安装
(1).从https://neo4j.com/download-center/#community下载最新的Neo4j Server安装文件
可以看到neo4J软件exe或zip格式的所有版本
(2).下载Neo4j 3.5.17 (zip)
(3).解压
(4).修改配置文件
dbms.connectors.default_listen_address=0.0.0.0
(5) .通过neo4j.bat install-service安装neo4j服务
注意的问题 如果是4.0以及以上版本需要jdk11
修改文件bin/neo4j.ps1
Import-Module “neo4j的主目录\bin\Neo4j-Management.psd1”
(6).neo4j.bat启动
neo4j.bat start
(7).使用浏览器 访问服务器上的neo4j
http://127.0.0.1:7474
默认的账号是neo4j密码neo4j这里第一次登录的话会要求修改密码

3.5 Neo4j数据浏览器

数据浏览器访问
一旦我们安装Neo4j,我们可以访问Neo4j数据浏览器使用以下URL
http://ip:7474/browser/
image.png

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

导出CSV或者JSON
单击“导出CSV”按钮以csv文件格式导出结果。

4.Neo4j CQL

4.1 CQL简介

CQL代表Cypher查询语言。 像关系型数据库具有查询语言SQL,Neo4j使用CQL作为查询语言。
Neo4j CQL

  • 它是Neo4j图形数据库的查询语言。
  • 它是一种声明性模式匹配语言。
  • 它遵循SQL语法。
  • 它的语法是非常简单且人性化、可读的格式。

常用的Neo4j CQL命令/条款如下:
image.png
完成上面的语法 我们基于庆余年电视剧人物关系图片:
image.png

4.2 CREATE

CREATE ( 
  <node-name>:<label-name> 
  [{ 
   <property1-name>:<property1-Value>
   ........ 
   <propertyn-name>:<propertyn-Value> 
   }] 
)

语法说明:
image.png
举例:

CREATE (person:Person)
CREATE (
  person:Person 
  {cid:1,name:"范 闲",age:24,gender:0,character:"A",money:1000}
);

CREATE (
  person:Person 
  {cid:2,name:"林婉 儿",age:20,gender:1,character:"B",money:800}
);
CREATE (
  person:Person 
  {cid:3,name:"庆 帝",age:49,gender:0,character:"A",money:8900}
);

4.3 MATCH RETURN命令语法

MATCH (
  <node-name>:<label-name> 
)
RETURN <node-name>.<property1-name>, 
...
<node-name>.<propertyn-name>

image.png
举例:

MATCH (person:Person) return person
MATCH (person:Person) return person.name,person.age
MATCH(p:Person {name:"范闲"}) return p,ID(p)

4.4关系创建

  • 使用现有节点创建没有属性的关系
    MATCH (
      <node1-name>:<node1-label-name>),
      (<node2-name>:<node2-label-name>) 
    CREATE(<node1-name>)-[<relationship-name>:<relationship-label-name>]->(<node2- name>) 
    RETURN 相应的内容
    语法说明:
    image.png
创建关系 
match(person:Person {name:"范闲"}) ,(person2:Person {name:"林婉儿"}) 
create(person)-[r:Couple]->(person2); 

查询关系
match p = (person:Person {name:"范闲"})-[r:Couple]->(person2:Person) return p 
match (p1:Person {name:"范闲"})-[r:Couple]-(p2:Person) return p1,p2 
match (p1:Person {name:"范闲"})-[r:Couple]-(p2:Person) return r
  • 使用现有节点创建有属性的关系

    MATCH (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) 
    CREATE(<node1-label-name>)-[<relationship-label-name>:<relationship-name> {<define-properties-list>}]->(<node2-label-name>) 
    RETURN <relationship-label-name>
    
    其中<define-properties-list> 是分配给新创建关系的属性(名称 - 值对)的列表。
    { 
    <property1-name>:<property1-value>,
    <property2-name>:<property2-value>, 
    ...
    <propertyn-name>:<propertyn-value> 
    }
    match(person:Person {name:"范闲"}),(person2:Person {name:"林婉儿"})
    create(person)-[r:Couple{mary_date:"12/12/2014",price:55000}]->(person2) return r;
  • 使用新节点创建没有属性的关系

    CREATE (
      <node1-label-name>:<node1-name>) -[<relationship-label-name>:<relationship-name>]-> 
      (<node1-label-name>:<node1-name>
                                                                                          )
    create(person1:Person 
           {cid:4,name:"长公 主",age:49,gender:1,character:"A",money:5000}) 
           -[r:Friend]-> 
           (person2:Person {cid:7,name:"九品射手燕小 乙",age:48,gender:0,character:"B",money:1000})
  • 使用新节点创建有属性的关系

    CREATE 
    (<node1-label-name>:<node1-name>{<define-properties-list>})
    -[<relationship-label-name>:<relationship-name>{<define-properties-list>}] 
    ->
    (<node1-label-name>:<node1-name>{<define-properties-list>})
    create 
    (person1:Person {cid:9,name:"靖王世子",age:23,gender:0,character:"A",money:3000}) 
    -[r:Friend {date:"11-02-2000"}]-> 
    (person2:Person {cid:8,name:"二皇子",age:24,gender:0,character:"B",money:6000})

    关系和节点的属性可以使用的类型
    image.png

4.5 CREATE创建多个标签

CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>) 
如: 
CREATE (person:Person:Beauty:Picture {cid:20,name:"小美女"})

4.6 WHERE子句

简单的WHERE子句
	WHERE <condition> 
复杂的WHERE子句 
	WHERE <condition> <boolean-operator> <condition>

where中的比较运算符 和 之前mysql的相同 如= != <> > <等
image.png

MATCH (person:Person) WHERE person.name = '范闲' OR person.name = '靖王世子' RETURN person

4.7 DELETE子句 和REMOVE子句

DELETE子句

  • 删除节点。
  • 删除节点及相关节点和关系。

    match p = (:Person {name:"林婉儿"})-[r:Couple]-(:Person) delete r

    REMOVE子句

  • 删除节点或关系的标签

  • 删除节点或关系的属性

    MATCH (person:Person {name:"小美女"})
    REMOVE person.cid

    4.8 SET子句

  • 向现有节点或关系添加新属性

  • 更新属性值
    MATCH (person:Person {cid:1}) 
    SET person.money = 3456,person.age=25

    4.9 ORDER BY子句

    “ORDER BY”子句,对MATCH查询返回的结果进行排序。
    我们可以按升序或降序对行进行排序。
    默认情况下,它按升序对行进行排序。 如果我们要按降序对它们进行排序,我们需要使用DESC子句。
    MATCH (person:Person) 
    RETURN person.name,person.money 
    ORDER BY person.money DESC

    4.10 SKIP和LIMIT

    Neo4j CQL已提供“SKIP”子句来过滤或限制查询返回的行数。 它修整了CQL查询结果集顶部的结果。
    Neo4j CQL已提供“LIMIT”子句来过滤或限制查询返回的行数。 它修剪CQL查询结果集底部的结果。
    MATCH (person:Person) 
    RETURN ID(person),person.name,person.money 
    ORDER BY person.money DESC skip 4 limit 2

    4.11 DISTINCT排重

    这个函数的用法就像SQL中的distinct关键字,返回的是所有不同值。
    MATCH (p:Person) RETURN Distinct(p.character)