用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系

  
  我第一次建立关联图谱用的是R语言,通过写代码帮公安挖掘团伙犯罪,并用图形展示团伙之间的关联关系。如有需要请关注 “阿黎逸阳的代码” 公众号的后续文章,会手把手教大家用R搭建关联图谱,做成app,让没有安装R的电脑通过你分享的网址链接看到罪犯的关联关系。
  
  公司最近又有挖掘团伙犯罪的项目,这次想在关联关系的基础上利用模型算法寻找犯罪团伙。这一次选用的是基于java实现的开源图数据库neo4jPython,搭建关联图谱。
  
  本文介绍用Python调用neo4j,搭建简单关联图谱,并用实例让大家快速熟悉语法。后续文章会探讨社群发现算法在关联图谱中的应用,欢迎持续关注。

  

文章目录

      • 一、Python连接neo4j
      • 二、创建节点
        • 1 删除数据库中以往的图,确保在一个空白的环境中进行操作
        • 2 创建人物节点
        • 3 创建工作节点和地点节点
      • 三、创建关系
        • 1 创建人物之间的关系
        • 2 创建人物和居住地址之间的关系
        • 3 创建人物和职业之间的关系
      • 四、查询
        • 1 查节点
        • 2 查关系
      • 五、更新图形
        • 1 为节点增加属性
        • 2 为关系增加属性
        • 3 删除某个节点或关系

  

一、Python连接neo4j

  
  使用Python调用neo4j,需要安装py2neo库,详细安装过程见:Python安装py2neo库 。安装好py2neo库后,可执行如下语句用Python连接neo4j(注: username和password需换成你的注册用户名和密码)。
  

from py2neo import Graph, Node, Relationship
graph = Graph(
    "http://localhost:7474", 
    username="neo4j", 
    password="123456"
)

  

二、创建节点

  
为便于理解,本文关系数据采用家有儿女中的人物关系。
  

1 删除数据库中以往的图,确保在一个空白的环境中进行操作

graph.delete_all()

该语句可以删除neo4j数据库中的所有图,确保在一个空白的环境中进行操作,避免以往项目数据对当前项目的干扰,但不是必须执行的语句。
  
  

2 创建人物节点

node_1 = Node("person", name = "夏东海")
graph.create(node_1)

create是创建操作,person是标签,代表节点的类型,name是属性,一个节点可以用逗号隔开同时创建多个属性。该语句表示创建一个标签为person的节点,该节点有一个name属性,属性值是夏东海。在neo4j中点击红框中的图标,就可以展示以上语句创建的点。也可以使用如下CQL查询语句进行查询。
  

match (n) return n

用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第1张图片  
创建家有儿女中主要人物的节点

node_2 = Node("person", name = "刘梅")
node_3 = Node("person", name = "刘星")
node_4 = Node("person", name = "夏雪")
node_5 = Node("person", name = "夏雨")
node_6 = Node("person", name = "胡统一")
node_7 = Node("person", name = "玛丽")
node_8 = Node("person", name = "戴明明")
node_9 = Node("person", name = "戴天高")
node_10 = Node("person", name = "胖婶")
node_11 = Node("person", name = "夏祥")
graph.create(node_2)
graph.create(node_3)
graph.create(node_4)
graph.create(node_5)
graph.create(node_6)
graph.create(node_7)
graph.create(node_8)
graph.create(node_9)
graph.create(node_10)
graph.create(node_11)

在noe4j中运行如下语句

match(n) return n

得到结果如下:
  
用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第2张图片

  
  

3 创建工作节点和地点节点

node_12 = Node("job", name = "护士长")
node_13 = Node("job", name = "学生")
node_14 = Node("job", name = "编导")
node_15 = Node("job", name = "无业游民")
node_16 = Node("job", name = "社区工作人员")
node_17 = Node("job", name = "无业游民")
node_18 = Node("location", country = "中国", city = '北京')
node_19 = Node("location", country = "美国", city = '纽约')
graph.create(node_12)
graph.create(node_13)
graph.create(node_14)
graph.create(node_15)
graph.create(node_16)
graph.create(node_17)
graph.create(node_18)
graph.create(node_19)   

运行如下语句

match(n) return n

得到结果如下:

用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第3张图片
  
  

三、创建关系

  

1 创建人物之间的关系

  
创建刘梅和夏东海之间的关系

node_1_call_node_2 = Relationship(node_1,'丈夫',node_2)
graph.create(node_1_call_node_2)

该语句表示node_1是node_2的丈夫,其中node_1代表夏东海,node_2代表刘梅。
  
用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第4张图片
  
也可以先不创建点,直接在生成关系的时候创建点。

r1 = Relationship(Node("person", name = "刘梅"),'妈妈',Node("person", name = "刘星"))
graph.create(r1)

在这里插入图片描述
不过这种方式生成的点都是离散的,不能生成双向图。比如运行如下语句:
  

r1 = Relationship(Node("person", name = "刘梅"),'妈妈',Node("person", name = "刘星"))
r2 = Relationship(Node("person", name = "刘星"),'儿子',Node("person", name = "刘梅"))
graph.create(r1)
graph.create(r2)

得到结果如下:
  
用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第5张图片
  
如果想生成双向图,可以先创建点,再生成关系,运行如下语句:

node_1 = Node("person", name = "夏东海")
node_2 = Node("person", name = "刘梅")
r1 = Relationship(node_1,'丈夫',node_2)
r2 = Relationship(node_2,'妻子',node_1)
graph.create(r1)
graph.create(r2)

得到结果如下:
  
在这里插入图片描述
创建家有儿女中主要人物的关系

r3 = graph.create(Relationship(node_1,'继父',node_3))
r4 = graph.create(Relationship(node_3,'继子',node_1))
r5 = graph.create(Relationship(node_1,'父亲',node_4))
r6 = graph.create(Relationship(node_4,'女儿',node_1))
r7 = graph.create(Relationship(node_1,'父亲',node_5))
r8 = graph.create(Relationship(node_5,'儿子',node_1))
r9 = graph.create(Relationship(node_1,'前夫',node_7))
r10 = graph.create(Relationship(node_7,'前妻',node_1))
r11 = graph.create(Relationship(node_1,'儿子',node_11))
r12 = graph.create(Relationship(node_11,'父亲',node_1))
r13 = graph.create(Relationship(node_2,'母亲',node_3))
r14 = graph.create(Relationship(node_3,'儿子',node_2))
r15 = graph.create(Relationship(node_2,'继母',node_4))
r16 = graph.create(Relationship(node_4,'继女',node_2))
r17 = graph.create(Relationship(node_2,'继母',node_5))
r18 = graph.create(Relationship(node_5,'继子',node_2))
r19 = graph.create(Relationship(node_2,'前妻',node_6))
r20 = graph.create(Relationship(node_6,'前夫',node_2))
r21 = graph.create(Relationship(node_2,'同学',node_9))
r22 = graph.create(Relationship(node_9,'同学',node_2))
r23 = graph.create(Relationship(node_2,'邻居',node_10))
r24 = graph.create(Relationship(node_10,'邻居',node_2))
r25 = graph.create(Relationship(node_3,'弟弟',node_4))
r26 = graph.create(Relationship(node_4,'姐姐',node_3))
r27 = graph.create(Relationship(node_3,'哥哥',node_5))
r28 = graph.create(Relationship(node_5,'弟弟',node_3))
r29 = graph.create(Relationship(node_3,'儿子',node_6))
r30 = graph.create(Relationship(node_6,'父亲',node_3))
r31 = graph.create(Relationship(node_4,'姐姐',node_5))
r32 = graph.create(Relationship(node_5,'弟弟',node_4))
r33 = graph.create(Relationship(node_4,'女儿',node_7))
r34 = graph.create(Relationship(node_7,'母亲',node_4))
r35 = graph.create(Relationship(node_4,'朋友',node_8))
r36 = graph.create(Relationship(node_8,'朋友',node_4))
r37 = graph.create(Relationship(node_5,'儿子',node_7))
r38 = graph.create(Relationship(node_7,'母亲',node_5))
r39 = graph.create(Relationship(node_8,'女儿',node_9))
r40 = graph.create(Relationship(node_9,'父亲',node_8))

运行如下语句

match(n) return n

得到结果如下:
  
用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第6张图片  
  
  

2 创建人物和居住地址之间的关系

  

创建家有儿女中主要人物的居住地址关系

r41 = graph.create(Relationship(node_1,'居住地',node_18))
r42 = graph.create(Relationship(node_2,'居住地',node_18))
r43 = graph.create(Relationship(node_3,'居住地',node_18))
r44 = graph.create(Relationship(node_4,'居住地',node_18))
r45 = graph.create(Relationship(node_5,'居住地',node_18))
r46 = graph.create(Relationship(node_7,'居住地',node_19))

得到结果如下:
  
用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第7张图片  

  

3 创建人物和职业之间的关系

  
创建家有儿女中主要人物职业关系

r47 = graph.create(Relationship(node_1,'职业',node_14))
r48 = graph.create(Relationship(node_2,'职业',node_12))
r49 = graph.create(Relationship(node_3,'职业',node_13))
r50 = graph.create(Relationship(node_4,'职业',node_13))
r51 = graph.create(Relationship(node_5,'职业',node_13))
r52 = graph.create(Relationship(node_8,'职业',node_13))
r53 = graph.create(Relationship(node_6,'职业',node_15))
r54 = graph.create(Relationship(node_10,'职业',node_16))

得到结果如下:
  
用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第8张图片
  
至此,基于家有儿女中人物关系的关联图谱已经建好,接下来讲一讲查询。

  
  

四、查询

  

1 查节点

  
查询所有标签为人的节点

import pandas as pd
print(pd.DataFrame(graph.nodes.match('person')))

得到结果如下:
在这里插入图片描述

  

2 查关系

  
查询所有关系为父亲的节点

print(list(graph.match(r_type="父亲")))

得到结果如下:
在这里插入图片描述
  
  

五、更新图形

  

1 为节点增加属性

node_1['sex'] = '男'
graph.push(node_1)

得到对比结果如下:
用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第9张图片
     原始
用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第10张图片
      增加属性性别

  

2 为关系增加属性

node_20 = Node("person", name = "夏雪")
node_21 = Node("person", name = "戴明明")
node_20_call_node_21 = Relationship(node_20,'朋友',node_21)
graph.create(node_20_call_node_21)
node_20_call_node_21['程度'] = '普通'
graph.push(node_20_call_node_21)

得到对比结果如下:
用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第11张图片
    原始
用Python中的py2neo库操作neo4j,搭建简单关联图谱—基于家有儿女中的人物关系_第12张图片
   增加属性程度
  
  

3 删除某个节点或关系

graph.delete(node_3)
graph.delete(r1)

用delete语句删除之前创建的node_3节点和r1关系。

  Python调用py2neo创建简单关联图谱的基本语句就是上面这些啦,大家入门愉快。这篇文章可以和基于CQL语言调用noe4j搭建简单关联图谱的文章:手把手教你用neo4j搭建简单关联图谱(基于家有儿女中的人物关系) 一起对比阅读,能对neo4j有一个更清晰的认识。
  
参考文献

https://zhuanlan.zhihu.com/p/30116307
https://zhuanlan.zhihu.com/p/43492827
https://zhuanlan.zhihu.com/p/59137998
https://zhuanlan.zhihu.com/p/111260930
https://baijiahao.baidu.com/s?id=1639202882632470513&wfr=spider&for=pc

  
你可能感兴趣:
用Python绘制皮卡丘
用Python绘制词云图
Python画好看的星空图(唯美的背景)
Python浪漫表白源码合集(爱心、玫瑰花、照片墙、星空下的告白)

长按(扫一扫)识别上方二维码学习更多Python和建模知识,让你的学习和工作更出彩。

你可能感兴趣的:(学习python,关联图谱,图数据库,python,数据库,neo4j)