基于neo4j的知识图谱构建及Py2neo的使用总结

目录

前言

1.Py2neo的安装:

2.Py2neo的基本语法:

两种操作模式:

①库的引入和neo4j本地连接的建立

②节点的建立

③节点的删除

④属性的增加和修改

⑤关系的建立

⑥查询

⑦match函数

3.create和merge创建节点的区别:


前言

        neo4j是当前知识图谱构建所采用的主流图数据库,其特点是可视化程度高,并且可以通过python操作。本文总结了利用python创建基于neo4j的知识图谱的流程和基本操作,可供新接触者进行基本了解。


1.Py2neo的安装:

一般推荐使用Py2neo v4,因为该库体积较小,只有不到200kb,因此不需要使用清华源等镜像下载。

安装方法:

在终端中输入

pip install --upgrade py2neo

官方使用文档:

Py2neo官网

2.Py2neo的基本语法:

两种操作模式:

对数据的操作分为两种方式,一种是直接使用neo4j的cypher语法;另一种是采用py2neo提供的数据结构和编写方式。

第一种方法的基本用法是在test_graph.run中填写cypher语句,如:

test_graph.run(" match(n) detach delete n")#删除当前图的内容

①库的引入和neo4j本地连接的建立

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函数

match子句是查询的核心,-> 和 <- 表示联系的方向。这句代码的含义为我要找b和c,那b和c是什么关系呢?

首先b是管理a的,而a的标签为一名士兵,并且姓名为燕破岳(当然这里输入其他的属性也可以),其次b和c是同级的关系。那么这样就可以返回b和c的关系,如:

match (a:士兵 {姓名:'燕破岳'})<-[:管理]-(b)-[:同级]->(c) return b,c

3.create和merge创建节点的区别:

create不会去判断节点中是否有重复数据,只是添加,因此对同一段代码多次调试会生成多个重复的节点; merge等于是create+match,如果节点中有重复数据,就不会添加进去。

但py2neo和cypher中的merge方法有所不同。

在cypher中,MERGE方式是当你创建一个实体时,程序会检测是否已有这个实体存在,检测的方法是进行label和property的匹配。如果已存在则不创建。 py2neo方法中的merge则是,同样进行匹配,如果匹配上则用当前实体覆盖数据库中的已有实体。 这里的主要区别在于,匹配时一般只会用到关键的少数property,根据某个property去决定是否覆盖时,其他property可能是不相等的。

因此cypher是用数据库实体覆盖新创建的,py2neo是用新的覆盖旧的。 考虑到创建时属性可能比较少,因此在py2neo中慎用merge,可以先做存在判断,然后再用create语句.

你可能感兴趣的:(大数据,python,知识图谱,nlp)