手把手教你用neo4j搭建简单关联图谱(基于家有儿女中的人物关系)
我第一次建立关联图谱用的是R语言,通过写代码帮公安挖掘团伙犯罪,并用图形展示团伙之间的关联关系。
如有需要请关注本公众号的后续文章,会手把手教大家用R搭建关联图谱,做成app,让没有安装R的电脑通过你分享的网址链接看到罪犯的关联关系。
本文跟大家一起用neo4j一步步搭建简单关联图谱,让大家快速熟悉neo4j的语法。为便于理解,关系数据采用家有儿女中的人物关系。
一、创建节点
1 删除数据库中以往的图,确保在一个空白的环境中进行操作
match (n) detach delete n
match是匹配操作,小括号(可以想象成小圆)表示节点node,n为标识符,通过该语句可以删除neo4j数据库中所有点。
2 创建人物节点
create (n:Person {name:'夏东海'}) return n
create是创建操作,n是节点名,Person是标签,代表节点的类型,花括号中存放节点的属性。
该语句表示创建一个标签为Person的节点,该节点有一个name属性,属性值是夏东海。
加了return n就会在neo4j中显示创建好该节点的图,不加只创建点,不展示图。
创建家有儿女中主要人物的节点
create (n:Person {name:'刘梅'}) return n
create (n:Person {name:'刘星'}) return n
create (n:Person {name:'夏雪'}) return n
create (n:Person {name:'夏雨'}) return n
create (n:Person {name:'胡统一'}) return n
create (n:Person {name:'玛丽'}) return n
create (n:Person {name:'范晓英'}) return n
create (n:Person {name:'夏祥'}) return n
create (n:Person {name:'杨欣'}) return n
create (n:Person {name:'戴明明'}) return n
create (n:Person {name:'戴天高'}) return n
create (n:Person {name:'胖婶'}) return n
运行如下语句
match(n) return n
得到结果如下:
3 创建工作节点和地点节点
create (n:Job {title:'护士长'}) return n
create (n:Job {title:'学生'}) return n
create (n:Job {title:'编导'}) return n
create (n:Job {title:'无业游民'}) return n
create (n:Job {title:'社区工作人员'}) return n
create (n:Job {title:'无业游民'}) return n
create (n:Location {country:'中国',city:'北京'})
create (n:Location {country:'美国',city:'纽约'})
运行如下语句
match(n) return n
得到结果如下:
感觉这个颜色组合起来有点丑,可以运行如下语句:
:style
点击右下角的图标可以更换颜色
二、创建关系
1 创建人物之间的关系
创建刘梅和夏东海之间的关系
match (a:Person {name:'刘梅'}), (b:Person {name:'夏东海'}) MERGE (a)-[:妻子]->(b)
该语句中的-[:妻子]->表示刘梅是夏东海的妻子。
创建家有儿女中主要人物的关系
match (a:Person {name:'刘梅'}), (b:Person {name:'夏东海'}) MERGE (a)-[:'妻子']->(b)
match (a:Person {name:'刘梅'}), (b:Person {name:'夏雨'}) MERGE (a)-[:继母]->(b)
match (a:Person {name:'刘梅'}), (b:Person {name:'夏雪'}) MERGE (a)-[:继母]->(b)
match (a:Person {name:'刘梅'}), (b:Person {name:'胡统一'}) MERGE (a)-[:前妻]->(b)
match (a:Person {name:'刘星'}), (b:Person {name:'刘梅'}) MERGE (a)-[:儿子]->(b)
match (a:Person {name:'刘星'}), (b:Person {name:'胡统一'}) MERGE (a)-[:儿子]->(b)
match (a:Person {name:'夏东海'}), (b:Person {name:'刘星'}) MERGE (a)-[:继父]->(b)
match (a:Person {name:'玛丽'}), (b:Person {name:'夏东海'}) MERGE (a)-[:前妻]->(b)
match (a:Person {name:'夏雪'}), (b:Person {name:'夏东海'}) MERGE (a)-[:女儿]->(b)
match (a:Person {name:'夏雨'}), (b:Person {name:'夏东海'}) MERGE (a)-[:儿子]->(b)
match (a:Person {name:'夏雪'}), (b:Person {name:'玛丽'}) MERGE (a)-[:女儿]->(b)
match (a:Person {name:'夏雨'}), (b:Person {name:'玛丽'}) MERGE (a)-[:儿子]->(b)
match (a:Person {name:'夏雨'}), (b:Person {name:'夏雪'}) MERGE (a)-[:弟弟]->(b)
match (a:Person {name:'夏雪'}), (b:Person {name:'刘星'}) MERGE (a)-[:姐姐]->(b)
match (a:Person {name:'刘星'}), (b:Person {name:'夏雨'}) MERGE (a)-[:哥哥]->(b)
match (a:Person {name:'戴明明'}), (b:Person {name:'夏雪'}) MERGE (a)-[:朋友]->(b)
match (a:Person {name:'戴天高'}), (b:Person {name:'刘梅'}) MERGE (a)-[:同学]->(b)
match (a:Person {name:'戴天高'}), (b:Person {name:'戴明明'}) MERGE (a)-[:父亲]->(b)
match (a:Person {name:'胖婶'}), (b:Person {name:'刘梅'}) MERGE (a)-[:邻居]->(b)
match (a:Person {name:'夏祥'}), (b:Person {name:'夏东海'}) MERGE (a)-[:父亲]->(b)
运行如下语句
match(n) return n
得到结果如下:
2 创建人物和居住地址之间的关系
创建家有儿女中主要人物的居住地址关系
match (a:Person {name:'刘梅'}),(b:Location {country:'中国',city:'北京'}) MERGE (a)-[:居住]->(b)
match (a:Person {name:'夏东海'}),(b:Location {country:'中国',city:'北京'}) MERGE (a)-[:居住]->(b)
match (a:Person {name:'玛丽'}),(b:Location {country:'美国',city:'纽约'}) MERGE (a)-[:居住]->(b)
得到结果如下:
3 创建人物和职业之间的关系
创建家有儿女中主要人物职业关系
match (a:Person {name:'刘梅'}),(b:Job {title:'护士长'}) MERGE (a)-[:职业]->(b)
match (a:Person {name:'夏东海'}),(b:Job {title:'编导'}) MERGE (a)-[:职业]->(b)
match (a:Person {name:'胡统一'}),(b:Job {title:'无业游民'}) MERGE (a)-[:职业]->(b)
match (a:Person {name:'夏雨'}),(b:Job {title:'学生'}) MERGE (a)-[:职业]->(b)
match (a:Person {name:'刘星'}),(b:Job {title:'学生'}) MERGE (a)-[:职业]->(b)
match (a:Person {name:'夏雪'}),(b:Job {title:'学生'}) MERGE (a)-[:职业]->(b)
match (a:Person {name:'胖婶'}),(b:Job {title:'社区工作人员'}) MERGE (a)-[:职业]->(b)
得到结果如下:
至此,基于家有儿女中人物关系的关联图谱已经建好,接下来讲一讲查询。
三、查询
1 查询单个点
MATCH (n:Person)
WHERE n.name = '夏东海'
RETURN n
上面的语句为查询属性名为夏东海的节点,得到结果
2 查询所有关系的节点
MATCH (n)--() RETURN n
得到结果如下:
3 查询单个关系
查询身份为学生的所有人
MATCH (a:Person)-[:职业]->(b:Job {title:'学生'}) RETURN a,b
得到结果如下:
找到了夏雪、刘星、夏雨三个身份为学生的人。
4 查询所有对外有关系的节点
MATCH (n)-->() RETURN n
得到结果如下:
职业和居住地址等对外有没有关系的节点就不会展示。
5 查询关系为父亲的子图
MATCH (n)-[:父亲]-() RETURN n
得到结果如下:
四、更新图形
1 为节点增加属性
match (n) where id(n)=48 set n.sex = '男' return n;
得到结果如下:
2 为节点增加标签
match (n) where id(n)=33 set n:护士 return n;
得到结果如下:
3 为关系增加属性
match (n)<-[r]-(m) where id(n)=48 and id(m)=33 set r.team='夫妻' return n;
match (n)<-[r]-(m) where id(n)=48 and id(m)=68 set r.team='父子' return n;
match (n)<-[r]-(m) where id(n)=48 and id(m)=36 set r.team='父子' return n;
查询所有点
MATCH (n) RETURN n LIMIT 25
得到结果如下:
neo4j创建关联图谱的基本语句就是上面这些啦,大家入门愉快。
参考文献
https://zhuanlan.zhihu.com/p/88745411 https://www.cnblogs.com/ljhdo/p/5516793.html https://www.w3cschool.cn/neo4j/neo4j_cql_where_clause.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 5分钟Flink - 侧输出流(SideOutput)
- 数据库技术:MySQL 基础和 SQL 入门,单表、约束和事务
- ConcurrentHashMap的size方法是线程安全的吗?
- 数据科学家极力推荐核心计算工具-Numpy的前世今生(上)
- 数据库技术:MySQL 多表,外键约束,数据库设计,索引,视图,存储过程触发器,数据控制,数据备份与恢复
- WordPress 站点地址被恶意篡改的防护方案讨论
- 握草,你竟然在代码里下毒!
- MySQL 练习题和答案,以及运行结果截图
- 给你一个优秀的Django工程模板
- 纯css实现选项卡功能
- linux每日一练文件专题之常用文件命令(附昨日答案)
- 搞懂JavaScript全局变量与局部变量,看这篇文章就够了
- Day3-linux用户管理
- rbind的坑?
- 全文检索工具Lucene入门教程