目录
前言
1.Py2neo的安装:
2.Py2neo的基本语法:
两种操作模式:
①库的引入和neo4j本地连接的建立
②节点的建立
③节点的删除
④属性的增加和修改
⑤关系的建立
⑥查询
⑦match函数
3.create和merge创建节点的区别:
neo4j是当前知识图谱构建所采用的主流图数据库,其特点是可视化程度高,并且可以通过python操作。本文总结了利用python创建基于neo4j的知识图谱的流程和基本操作,可供新接触者进行基本了解。
一般推荐使用Py2neo v4,因为该库体积较小,只有不到200kb,因此不需要使用清华源等镜像下载。
安装方法:
在终端中输入
pip install --upgrade py2neo
官方使用文档:
Py2neo官网
对数据的操作分为两种方式,一种是直接使用neo4j的cypher语法;另一种是采用py2neo提供的数据结构和编写方式。
第一种方法的基本用法是在test_graph.run中填写cypher语句,如:
test_graph.run(" match(n) detach delete n")#删除当前图的内容
from py2neo import Graph,Node,Relationship
test_graph = Graph("http://localhost:7474",
username="neo4j",
password="neo4j" #neo4j的初始密码是neo4j,后续使用自行修改后的密码 )
test_node1 = Node("Person",name = "大明")
test_node2 = Node("Person",name = "小王")
test_graph.create(test_node1)
test_graph.create(test_node2) #节点的建立可以使用create或merge,推荐使用merge,参考下方的补充
test_graph.merge(test_node1,"Person","name")
test_graph.merge(test_node2,"Person","name")
test_graph.delete(test_node2)#删除特定节点 test_graph.delete_all()#删除所有节点
test_node1['age'] = 20#对节点的属性进行本地修改
test_graph.push(test_node1)#节点属性的更新
test_node1['age'] = 22
test_graph.push(test_node1)
node_1_call_node_2['情况'] = '特别地' #对关系的属性进行本地修改
test_graph.push(node_1_call_node_2)
节点间的关系(Relationship)是有向的,所以在建立关系的时候,必须定义一个起始节点和一个结束节点。值得注意的是,起始节点可以和结束节点是同一个点,这时候的关系就是这个点指向它自己。
如果建立关系的时候,起始节点或者结束节点不存在,则在建立关系的同时建立这个节点。可利用这一点缩减代码量,但会影响独立节点的生成。
node_1_feel_node_2 = Relationship(test_node_1,'羡慕',test_node_2)
node_2_feel_node_1 = Relationship(test_node_2,'仰慕',test_node_1)
test_graph.create(node_1_feel_node_2)
test_graph.create(node_2_feel_node_1) #关系也要通过“建立”这一步才能实现
py2neo提供了专门的查询模块,即NodeMatcher和RelationshipMatcher,使用格式为:
matcher_1 = NodeMatcher(test_graph)
matcher_2 = RelationshipMatcher(test_graph)
# 匹配指定ID和year的Person结点
node = matcher_1.match("Person",ID='09076').where(year=2017)
#此处limit限制了返回匹配数量最多50 #个,#还有很多的筛选条件,可参考官方文档的说明
relation = matcher_2.matcher(r_type="羡慕").limit(50)
注意使用这两个模块后返回的结果仍然是NodeMatcher对象或RelationshipMatcher对象,要将其转换为实体,可以采用first()函数,或者变换成列表:
node_1 = matcher_1.match("Person",ID='09076').first() # 取第一个匹配到的节点
#或者:
result_1 = list(matcher_1.match("Person",ID='09076')) # 转换为列表
match子句是查询的核心,-> 和 <- 表示联系的方向。这句代码的含义为我要找b和c,那b和c是什么关系呢?
首先b是管理a的,而a的标签为一名士兵,并且姓名为燕破岳(当然这里输入其他的属性也可以),其次b和c是同级的关系。那么这样就可以返回b和c的关系,如:
match (a:士兵 {姓名:'燕破岳'})<-[:管理]-(b)-[:同级]->(c) return b,c
create不会去判断节点中是否有重复数据,只是添加,因此对同一段代码多次调试会生成多个重复的节点; merge等于是create+match,如果节点中有重复数据,就不会添加进去。
但py2neo和cypher中的merge方法有所不同。
在cypher中,MERGE方式是当你创建一个实体时,程序会检测是否已有这个实体存在,检测的方法是进行label和property的匹配。如果已存在则不创建。 py2neo方法中的merge则是,同样进行匹配,如果匹配上则用当前实体覆盖数据库中的已有实体。 这里的主要区别在于,匹配时一般只会用到关键的少数property,根据某个property去决定是否覆盖时,其他property可能是不相等的。
因此cypher是用数据库实体覆盖新创建的,py2neo是用新的覆盖旧的。 考虑到创建时属性可能比较少,因此在py2neo中慎用merge,可以先做存在判断,然后再用create语句.