图数据库Neo4j实战(全网最详细教程)
1. 图数据库Neo4j介绍
1.1 什么是图数据库(graph database)
随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数据量呈几何级数增长,急需一种支持海量复杂数据关系运算的数据库,图数据库应运而生。
世界上很多著名的公司都在使用图数据库,比如:
- 社交领域:Facebook, Twitter,Linkedin用它来管理社交关系,实现好友推荐
- 零售领域:eBay,沃尔玛使用它实现商品实时推荐,给买家更好的购物体验
- 金融领域:摩根大通,花旗和瑞银等银行在用图数据库做风控处理
- 汽车制造领域:沃尔沃,戴姆勒和丰田等顶级汽车制造商依靠图数据库推动创新制造解决方案
- 电信领域:Verizon, Orange和AT&T 等电信公司依靠图数据库来管理网络,控制访问并支持客户360
- 酒店领域:万豪和雅高酒店等顶级酒店公司依使用图数据库来管理复杂且快速变化的库存
图数据库并非指存储图片的数据库,而是以图数据结构存储和查询数据。
图数据库是基于图论实现的一种NoSQL数据库,其数据存储结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据。
图论〔Graph Theory〕是数学的一个分支。它以图为研究对象图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。

使用 Google+(GooglePlus)应用程序来了解现实世界中 Graph 数据库的需求。 观察下面的图表。
在这里,我们用圆圈表示了Google+应用个人资料

在上图中,轮廓“A”具有圆圈以连接到其他轮廓:家庭圈(B,C,D)和朋友圈(B,C)。
再次,如果我们打开配置文件“B”,我们可以观察以下链接的数据。

像这样,这些应用程序包含大量的结构化,半结构化和非结构化的连接数据。 在 RDBMS 数据库中表示这种非结构化连接数据并不容易。如果我们在 RDBMS 数据库中存储这种更多连接的数据,那么检索或遍历是非常困难和缓慢的。所以要表示或存储这种更连接的数据,我们应该选择一个流行的图数据库。
图数据库非常容易地存储这种更多连接的数据。 它将每个配置文件数据作为节点存储在内部,它与相邻节点连接的节点,它们通过关系相互连接。他们存储这种连接的数据与上面的图表中的相同,这样检索或遍历是非常容易和更快的。
关系查询性能对比:
在数据关系中心,图形数据库在查询速度方面非常高效,即使对于深度和复杂的查询也是如此。在关系型数据库和图数据库(Neo4j)之间进行了实验:在一个社交网络里找到 大深度为5的朋友的朋友,他们的数据集包括100万人,每人约有50个朋友。
实验结果如下:

对比关系型数据库
关系型数据库(RDBMS)图数据库表图行节点列和数据属性和关系约束关系在关系型数据库中,Person和department之间用外键表示关系:

在图数据库中,节点和关系取代表,外键和join:

在图数据库中,无论何时运行类似JOIN的操作,数据库都会使用此列表并直接访问连接的节点,而无需进行昂贵的搜索和匹配计算。
对比其他NoSQL数据库:
NoSQL数据库大致可以分为四类:
- 键值(key/value)数据库
- 列存储数据库
- 文档型数据库
- 图数据库


1.2 什么是Neo4j
Neo4j是一个开源的NoSQL图形数据库,2003 年开始开发,使用 scala和java 语言,2007年开始发布。
- 是世界上 先进的图数据库之一,提供原生的图数据存储,检索和处理;
- 采用属性图模型(Property graph model),极大的完善和丰富图数据模型;
- 专属查询语言 Cypher,直观,高效;
官网: https://neo4j.com/
Neo4j的特性:
- SQL就像简单的查询语言Neo4j CQL
- 它遵循属性图数据模型
- 它通过使用Apache Lucence支持索引
- 它支持UNIQUE约束
- 它包含一个用于执行CQL命令的UI:Neo4j数据浏览器
- 它支持完整的ACID(原子性,一致性,隔离性和持久性)规则
- 它采用原生图形库与本地GPE(图形处理引擎)
- 它支持查询的数据导出到JSON和XLS格式
- 它提供了REST API,可以被任何编程语言(如Java,Spring,Scala等)访问
- 它提供了可以通过任何UI MVC框架(如Node JS)访问的Java脚本
- 它支持两种Java API:Cypher API和Native Java API来开发Java应用程序
Neo4j的优点:
- 它很容易表示连接的数据
- 检索/遍历/导航更多的连接数据是非常容易和快速的
- 非常容易地表示半结构化数据
- Neo4j CQL查询语句命令是人性化的可读格式,非常容易学习
- 使用简单而强大的数据模型
- 不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引
1.3 Neo4j数据模型
图论基础
图是一组节点和连接这些节点的关系,图形以属性的形式将数据存储在节点和关系中,属性是用于表示数据的键值对。
在图论中,我们可以表示一个带有圆的节点,节点之间的关系用一个箭头标记表示。
简单的可能图是单个节点:

我们可以使用节点表示社交网络(如Google+(GooglePlus)个人资料),它不包含任何属性。向Google+个人资料添加一些属性:

在两个节点之间建立关系:

此处在两个配置文件之间创建关系名称“跟随”。 这意味着 Profile-I 遵循 Profile-II。
属性图模型
Neo4j图数据库遵循属性图模型来存储和管理其数据。
属性图模型规则
- 表示节点,关系和属性中的数据
- 节点和关系都包含属性
- 关系连接节点
- 属性是键值对
- 节点用圆圈表示,关系用方向键表示。
- 关系具有方向:单向和双向。
- 每个关系包含“开始节点”或“从节点”和“到节点”或“结束节点”
在属性图数据模型中,关系应该是定向的。如果我们尝试创建没有方向的关系,那么它将抛出一个错误消息。在Neo4j中,关系也应该是有方向性的。如果我们尝试创建没有方向的关系,那么Neo4j会抛出一个错误消息,“关系应该是方向性的”。
Neo4j图数据库将其所有数据存储在节点和关系中,我们不需要任何额外的RDBMS数据库或NoSQL数据库来存储Neo4j数据库数据,它以图的形式存储数据。Neo4j使用本机GPE(图形处理引擎)来使用它的本机图存储格式。
图数据库数据模型的主要构建模块是:
简单的属性图的例子:

这里我们使用圆圈表示节点。 使用箭头表示关系,关系是有方向性的。 我们可以用Properties(键值对)来表示Node的数据。 在这个例子中,我们在Node的Circle中表示了每个Node的Id属性。
1.4 Neo4j的构建元素
Neo4j图数据库主要有以下构建元素:

节点
节点(Node)是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一 样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。
- 节点是主要的数据元素
- 节点通过关系连接到其他节点
- 节点可以具有一个或多个属性(即,存储为键/值对的属性)
- 节点有一个或多个标签,用于描述其在图表中的作用
属性
属性(Property)是用于描述图节点和关系的键值对。其中Key是一个字符串,值可以通过使用任何 Neo4j数据类型来表示
- 属性是命名值,其中名称(或键)是字符串
- 属性可以被索引和约束
- 可以从多个属性创建复合索引
关系
关系(Relationship)同样是图数据库的基本元素。当数据库中已经存在节点后,需要将节点连接起来 构成图。关系就是用来连接两个节点,关系也称为图论的边(Edge) ,其始端和末端都必须是节点,关系不 能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type) 。
- 关系连接两个节点
- 关系是方向性的
- 节点可以有多个甚至递归的关系
- 关系可以有一个或多个属性(即存储为键/值对的属性)
基于方向性,Neo4j关系被分为两种主要类型:
标签
标签(Label)将一个公共名称与一组节点或关系相关联, 节点或关系可以包含一个或多个标签。 我们 可以为现有节点或关系创建新标签, 我们可以从现有节点或关系中删除标签。
- 标签用于将节点分组
- 一个节点可以具有多个标签
- 对标签进行索引以加速在图中查找节点
- 本机标签索引针对速度进行了优化
Neo4j 浏览器
一旦我们安装Neo4j,我们就可以访问Neo4j数据浏览器
访问 http://192.168.65.200:7474/browser

1.5 使用场景
- 欺诈检测

- 实时推荐引擎

2. 环境搭建
下载地址:https://neo4j.com/download-center/
安装方式:
1、Neo4j Enterprise Server(企业版)
2、Neo4j Community Server(社区版)
3、Neo4j Desktop(桌面版)
以下为对应的jdk1.8和neo4j的安装包:
链接:https://pan.baidu.com/s/1ZjfP4JJC_QN21j-V_YejrA
提取码:jfqq
安装Neo4j图型数据库步骤:
1.安装jdk1.8
2.安装好jdk后,再安装neo4j
下载好neo4j后,解压完后,配置环境变量:
添加NEO4J_HOME系统变量

添加path变量
配置好所有环境变量后,测试一下:
win+r打开运行,在cmd中输入:
启动后输入Http://localhost:7474 ,访问neo4j,默认账号和密码都为neo4j
2.1安装Neo4j Community Server
注意: neo4j最新版对应的java版本是jdk17

jdk8可以下载Neo4j Community Edition 3.5.28
文档:https://neo4j.com/docs/operations-manual/3.5/
解压到新目录(注意:目录名称不要有中文),比如: D:\neo4j\- # 将Neo4j作为控制台应用程序运行
- <NEO4J_HOME>\bin\neo4j console
- # 将Neo4j作为服务使用进行安装
- <NEO4J_HOME>\bin\neo4j install-service
复制代码console: 直接启动 neo4j 服务器
install-service | uninstall-service | update-service : 安装/卸载/更新 neo4j 服务
start/stop/restart/status: 启动/停止/重启/状态
-V 输出更多信息
进入到bin目录,执行在浏览器中访问http://localhost:7474
使用用户名neo4j和默认密码neo4j进行连接,然后会提示更改密码。
Neo4j Browser是开发人员用来探索Neo4j数据库、执行Cypher查询并以表格或图形形式查看结果的工 具。

3. Neo4j --CQL使用
3.1 Neo4j -- CQL简介
Neo4j的Cypher语言是为处理图形数据而构建的,CQL代表Cypher查询语言。像Oracle数据库具有查询语言SQL,Neo4j具有CQL作为查询语言。
- 它是Neo4j图形数据库的查询语言。
- 它是一种声明性模式匹配语言
- 它遵循SQL语法。
- 它的语法是非常简单且人性化、可读的格式。

三个共同朋友的社交图:

使用Cypher语言来描述关系:- (fox)<-[:knows]-(周瑜)-[:knows]->(诸葛)-[:knows]->(fox)
复制代码 3.2 CQL命令使用一
CQL命令官方文档:https://neo4j.com/docs/cypher-manual/3.5/clauses/match/
LOAD CSV
导入csv到neo4j
 - #将csv文件拷贝到 %NEO4J_HOME%\import目录
- load csv from 'file:///西游记,csv' as line
- create (:西游{name:line[0],tail:line[1],label:line[3]})
复制代码 CREATE 创建
create语句是创建模型语句用来创建数据模型
创建节点
- #创建简单节点
- create (n)
- #创建多个节点
- create (n),(m)
- #创建带标签和属性的节点并返回节点
- create (n:person {name:'如来'}) return n
复制代码 创建关系
Neo4j图数据库遵循属性图模型来存储和管理其数据。
根据属性图模型,关系应该是定向的。 否则,Neo4j将抛出一个错误消息。
基于方向性,Neo4j关系被分为两种主要类型。
- #使用新节点创建关系
- CREATE (n:person {name:'杨戬'})-[r:师傅]->(m:person {name:'玉鼎真人'}) return
- type(r)
- #使用已知节点创建带属性的关系
- match (n:person {name:'沙僧'}),(m:person{name:'唐僧'})
- create (n)-[r:`师傅`{relation:'师傅'}]->(m) return r
- #检索关系节点的详细信息
- match (n:person)-[r]-(m:person) return n,m
复制代码 创建全路径
- create p=(:person{name:'蛟魔王'})-[:义兄]->(:person{name:'牛魔王'})<-[:义兄]-
- (:person {name:'鹏魔王'}) return p
复制代码 DELETE删除
Neo4j使用CQL DELETE子句
- MATCH (n:`西游`) RETURN n LIMIT 25
复制代码 3.4 neo4j-admin使用(数据库备份、恢复)
数据库备份
对Neo4j数据进行备份、还原、迁移的操作时,要关闭neo4j- MATCH (n:`西游`) RETURN id(n),n.name,n.tail,n.relation
复制代码 数据库恢复
还原、迁移之前 ,要关闭neo4j服务。- MATCH (n:person) where n.name='孙悟空' or n.name='猪八戒' RETURN n
- #创建关系
- match (n:person),(m:person) where n.name='孙悟空' and m.name='猪八戒'
- create (n)-[r:师弟]->(m) return n.name,type(r),m.name
复制代码
4.案例
4.1创建股票知识图谱

创建一个简单的股票知识图谱,包括:
创建节点和关系:
1,建立几只股票的节点- # 删除节点 (前提:节点不存在关系)
- MATCH (n:person{name:"白龙马"}) delete n
- # 删除关系
- MATCH (n:person{name:"沙僧"})<-[r]-(m) delete r return type(r)
复制代码 2,建立上海证券交易所和深圳证券交易所两个节点- #删除属性
- MATCH (n:role {name:"fox"}) remove n.age return n
- #创建节点
- CREATE (m:role:person {name:"fox666"}) #m:role:person 可以给“fox666”既创建role节点又创建person节点
- #删除标签
- match (m:role:person {name:"fox666"}) remove m:person return m
复制代码 3,建立省市地方名称的节点- MATCH (n:role {name:"fox"}) set n.age=32 return n
复制代码 4,建立股票和证券交易所关系- MATCH (n:`西游`) RETURN id(n),n.name order by id(n) desc
复制代码 5,建立股票和省市名称关系- MATCH (n:role) RETURN n.name as name
- UNION
- MATCH (m:person) RETURN m.name as name
- MATCH (n:role) RETURN n.name as name
- UNION all
- MATCH (m:person) RETURN m.name as name
复制代码- # 前两行
- MATCH (n:`西游`) RETURN n LIMIT 2
- # 忽略前两行
- MATCH (n:person) RETURN n SKIP 2
复制代码 查询节点和关系:
6,查询某个股票的节点- match (n:`西游`) where n.label is null return id(n),n.name,n.tail,n.label
复制代码 7,查询某个标签的所有节点- match (n:`西游`) where n.name in['孙悟空','唐僧'] return id(n),n.name,n.tail,n.label
复制代码 8.查询两个节点之间的关系- # 创建索引
- create index on :`西游` (name)
- # 删除索引
- drop index on :`西游` (name)
复制代码 9,通过函数type获取关系的类型- #创建唯一约束
- create constraint on (n:xiyou) assert n.name is unique
- #删除唯一约束
- drop constraint on (n:xiyou) assert n.name is unique
复制代码 删除节点和关系
10,删除股票的节点- match (n:`西游`) return distinct(n.name)
复制代码 11,删除某个标签的节点- MATCH (e) RETURN id(e),e.name,substring(e.name,0,2)
复制代码 12,删除两个节点的关系- MATCH (e) RETURN count(e)
复制代码 13,删除全部关系- match (a)-[r] ->(b) return id(r),type(r)
复制代码 更新图形
set子句,用于对更新节点的标签和实体的属性;remove子句,用于删除实体的属性和节点的标签;
14,增加节点属性- cd %NEO4J_HOME%/bin
- #关闭neo4j
- neo4j stop #一定要先neo4j install -service,才可以执行neo4j stop
- #备份
- neo4j-admin dump --database=graph.db --to=/neo4j/backup/graph_backup.dump
复制代码 15,删除节点属性- #数据导入
- neo4j-admin load --from=/neo4j/backup/graph_backup.dump --database=graph.db --
- force
- #重启服务
- neo4j start
复制代码 4.2 利用CQL构建明星关系图谱
- create(n:stock{name:'招商银行',code:'600036',launchDate:date("2002-04-09")}),(:stock{name:'中科创达',code:'300496',launchDate:date("2015-12-10")}),(:stock{name:'华工科技',code:'000988',launchDate:date("2000-06-08")}),(:stock{name:'国信证券',code:'002736',launchDate:date("2014-12-29")})
复制代码 --> 收藏 关注 评论
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |