这里写目录标题
- 一、效果图
- 二、环境准备
- 三、数据库设计
- 3.1 人物节点设计
- 3.2 关系设计
- 四、操作步骤
- 4.1 下载、安装、启动Neo4J服务
- 4.1.1 配置Neo4J环境变量
- 4.1.2 启动Neo4J服务器
- 4.1.3 启动Ne04J客户端
- 4.2 创建节点
- 4.3 创建关系(从已有节点创建关系)
- 4.4 查询节点
- 4.5 查询关系
- 4.6 删除节点与关系
善始者繁多,克终者盖寡。
Neo4J属于NoSQL数据库的一种,具体来说属于图数据库,以存储类型划分常见的数据库分类如图所示。
在Neo4J中节点、关系、标签共同组成了一张图,图中每个元素有具有各自的属性,Neo4J与MySQL中名词解释可以对照如下表格。在MySQL中使用SQL实现增删改查等功能,在Neo4J中使用Cypher来实现,所以Cypher又称“CQL”。
MySQL | Neo4J |
---|---|
数据库 | 图 |
表 | 标签 |
记录 | 节点 |
属性 | 属性 |
XXX | 关系 |
SQL(Structured Query Language) | CQL (Cypher Query Language) |
本文使用Neo4J绘制《西游记》中部分人物关系图。
一、效果图
使用Neo4J数据库绘制《西游记》中唐三藏、孙悟空、猪八戒、沙悟净、玉皇大帝、太白金星、如来佛祖、菩提老祖等8位人物的关系图。实现效果如图所示:
二、环境准备
Neo4J是一款基于java开发的数据库产品,运行Neo4J必须安装jdk。jdk1.8支持Neo4J的最后一个版本为3.5,高版本Neo4J需要高版本jdk,低版本Neo4J会兼容高版本jdk,官方文档可以看Neo4J官方文档。
本例中JDK版本为1.8,Neo4J版本为3.5,其他版本Neo4J可以在仓库下载。
三、数据库设计
3.1 人物节点设计
此例涉及《西游记》中8名角色,所以图中包含8个节点,各节点属性及其关系如图所示。
3.2 关系设计
此例中8个人物共产生了6种18个关系,各关系起止节点如图所示。
四、操作步骤
在写代码前我们先简单说明Neo4J和Cypher的关系。
- Neo4J是一款基于JAVA开发的数据库产品,Cypher是一种查询语言,Neo4J中的操作通过Cypher语言实现
- Neo4J与Cypher的关系类似于MySQL和SQL的关系,所以Cypher也被叫做CQL。
4.1 下载、安装、启动Neo4J服务
4.1.1 配置Neo4J环境变量
依次点击“此电脑-属性-高级系统设置-环境变量-Path”, 在Path中加入“E:\neo4j-community-3.5.0\bin”。
4.1.2 启动Neo4J服务器
以管理员身份打开命令行,输入“neo4j”,此时页面会返回“console | start”等指令,输入“neo4j console”启动neo4j服务器,服务器启动成功会显示“Remote interface available at http://localhost:7474/”。(可以将Neo4J注册为本地服务,让它开机自启动,本例中未进行此操作)
服务器地址为:127.0.0.1:7687
4.1.3 启动Ne04J客户端
在浏览器“localhost:7474”启动neo4j客户端。
localhost:7474
初次启动需要输入密码,初始密码为“neo4j”,登录成功后界面如图所示。(注意:初次登录需要修改密码,修改密码不能为“neo4j”)后续操作均在客户端中进行,在Neo4J中可以批量执行指令,但是此例中使用了相同的变量名,所有不能一次复制多行代码并执行,请逐条执行。
4.2 创建节点
create(m:`西游记`{ name:"唐三藏",type:"主角团",曾工作单位:"佛教"}) return m
create(m:`西游记`{ name:"孙悟空",type:"主角团",曾工作单位:"天庭"}) return m
create(m:`西游记`{ name:"猪八戒",type:"主角团",曾工作单位:"天庭"}) return m
create(m:`西游记`{ name:"沙悟净",type:"主角团",曾工作单位:"天庭"}) return m
create(m:`西游记`{ name:"玉皇大帝",单位:"天庭"}) return m
create(m:`西游记`{ name:"太白金星",单位:"天庭"}) return m
create(m:`西游记`{ name:"如来佛祖",单位:"佛教"}) return m
create(m:`西游记`{ name:"菩提老祖",单位:"佛教"}) return m
名为“唐三藏”的节点截图如下所示。
代码解析:
create(m:`西游记`{ name:"唐三藏",type:"主角团",曾工作单位:"佛教"}) return m
- 使用create指令创建节点,范围为小括号内的所有东西
- m为该节点的变量名,可随意取名
- “西游记”是该节点所属的标签,在文字左右均使用单撇号括起来
- “{}”内为节点的属性名称及其取值
- return指令用于在屏幕上显示该节点,可以不要
4.3 创建关系(从已有节点创建关系)
match(m{ name:"唐三藏"}),(n{ name:"孙悟空"}) create (m)-[r:师傅]->(n) return r
match(m{ name:"唐三藏"}),(n{ name:"猪八戒"}) create (m)-[r:师傅]->(n) return r
match(m{ name:"唐三藏"}),(n{ name:"沙悟净"}) create (m)-[r:师傅]->(n) return r
match(m{ name:"如来佛祖"}),(n{ name:"唐三藏"}) create (m)-[r:师傅]->(n) return r
match(m{ name:"菩提老祖"}),(n{ name:"孙悟空"}) create (m)-[r:师傅]->(n) return r
match(m{ name:"孙悟空"}),(n{ name:"猪八戒"}) create (m)-[r:师兄]->(n) return r
match(m{ name:"孙悟空"}),(n{ name:"沙悟净"}) create (m)-[r:师兄]->(n) return r
match(m{ name:"猪八戒"}),(n{ name:"沙悟净"}) create (m)-[r:师兄]->(n) return r
match(m{ name:"玉皇大帝"}),(n{ name:"孙悟空"}) create (m)-[r:上司]->(n) return r
match(m{ name:"玉皇大帝"}),(n{ name:"猪八戒"}) create (m)-[r:上司]->(n) return r
match(m{ name:"玉皇大帝"}),(n{ name:"沙悟净"}) create (m)-[r:上司]->(n) return r
match(m{ name:"玉皇大帝"}),(n{ name:"太白金星"}) create (m)-[r:上司]->(n) return r
match(m{ name:"如来佛祖"}),(n{ name:"孙悟空"}) create (m)-[r:恩人]->(n) return r
match(m{ name:"太白金星"}),(n{ name:"孙悟空"}) create (m)-[r:恩人]->(n) return r
match(m{ name:"玉皇大帝"}),(n{ name:"如来佛祖"}) create (m)-[r:朋友]->(n) return r
match(m{ name:"如来佛祖"}),(n{ name:"玉皇大帝"}) create (m)-[r:朋友]->(n) return r
match(m{ name:"如来佛祖"}),(n{ name:"菩提老祖"}) create (m)-[r:同事]->(n) return r
match(m{ name:"菩提老祖"}),(n{ name:"如来佛祖"}) create (m)-[r:同事]->(n) return r
效果图如下所示:
代码解析:
match(m{ name:"唐三藏"}),(n{ name:"孙悟空"}) create (m)-[r:师傅]->(n) return r
- match指令用于查询对应节点,作用范围为小括号内,多个节点通过逗号分隔开
- m、n是给拟查询节点起的别名,“{}”内表示查询的条件
- create指令用于创建关系
- “[r:师傅]”中r表示关系的别名,“师傅”是真正的关系名称,(m)(n)表示前面查询的两个节点
- return指令用于在屏幕上显示该关系,可以不要
4.4 查询节点
①查询所有节点
match(m) return m
②查询《西游记》中的节点
match(m:`西游记`) return m
③查询主角团
match(m) where m.type="主角团" return m
执行该指令会显示满足条件的所有节点。
④查询单位在天庭的角色(包含曾今在天庭的)
当包含多个查询条件时可以使用where指令指定查询条件。
match(m) where m.单位="天庭" or m.曾工作单位="天庭" return m
⑤查询单位在佛教的角色(包含曾今在佛教的)
match(m) where m.单位="佛教" or m.曾工作单位="佛教" return m
4.5 查询关系
①查询所有关系及关系对应的节点
match r=(m)-->(n) return r
②查询名为“师傅”的关系
match (m)-[r:师傅]->(n) return r
此例中所有关系均无属性,所有查询结果均为一对空括号。
③查询名为“师傅”的关系及关系对应的节点
match p=(m)-[r:师傅]->(n) return p
④查询名为“上司”的关系
match (m)-[r:上司]->(n) return r
⑤查询名为“上司”的关系及关系对应的节点
match p=(m)-[r:上司]->(n) return p
4.6 删除节点与关系
删除节点前需要先找到该节点并删除与之有关的“关系”否则会报错,例如:直接删除“太白金星”这个节点。这类似于在MySQL中删除某张表之前需要先删除该表中所有的外键及其他约束。
①查询“太白金星”为起始节点的关系
match (m{name:"太白金星"})-[r]->(n) return r
②查询“太白金星”为终止节点的关系
match (m{name:"太白金星"})<-[r]-(n) return r
③删除与“太白金星”有关的所有关系(边删边验证)
match (m{name:"太白金星"})-[r]->(n) delete r
match(m) return m
match (m{name:"太白金星"})<-[r]-(n) delete r
match(m) return m
④删除名为“太白金星”的节点
match(m{name:"太白金星"}) delete m
match(m) return m