知识图谱Python.py2neo操作Neo4j
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识图谱Python.py2neo操作Neo4j相关的知识,希望对你有一定的参考价值。
Neo4j
为多种语言提供了 API 接口,如 java,python,C#,RUBY,.NET
等。在这里,我们主要介绍用 python
操作 Neo4j
。
环境安装
安装 ipython
在 Xfce
终端 pip
安装 ipython
pip3 install ipython
ipython是一个python的交互式shell,比默认的python shell好用得多,支持变量自动补全,自动缩进,支持bash shell命令,内置了许多很有用的功能和函数。学习ipython将会让我们以一种更高的效率来使用python。同时它也是利用Python进行科学计算和交互可视化的一个最佳的平台。
安装 py2neo
在 Xfce
终端 pip
安装 py2neo
pip3 install py2neo
若 Neo4j
未启动,则在进入 ipython
前启动 Neo4j
最后输入 ipython
进入实验环境
连接数据库
首先从 py2neo
库中导入 Graph
类,Graph
类表示 Neo4j
数据库中的图形数据存储空间,通过 URL 地址来连接。
from py2neo import Graph
# 连接本地的 Neo4j 数据库,地址为 127.0.0.1,http 端口默认为 7474,用户名和密码分别为 neo4j 与 123
graph = Graph(host='127.0.0.1', http_port=7474, user='neo4j', password='123')
此时本地的 Neo4j
数据库已成功连接,就可以对数据库进行操作了
创建节点
从 py2neo
库中导入 Node
类,并通过 Node
类来创建节点实例
from py2neo import Node
# 创建 角色 节点 郭靖,拥有属性 姓名-郭靖,性别-男
guojing = Node('角色',name='郭靖',sex='男')
# 创建 角色 节点 黄蓉,拥有属性 姓名-黄蓉,性别-女
huangrong = Node('角色',name='黄蓉',sex='女')
# 创建 作品 节点 射雕英雄传,拥有属性 名称-射雕英雄传,作者-金庸
shediao = Node('作品',name='射雕英雄传',author='金庸')
# 打印结果
guojing,huangrong,shediao
在创建好节点后,可以对节点进行操作,如:
# 获取 key 对应的属性
guojing['name']
# 设置 key 对应属性的 value,如果 key 不存在就创建
huangrong['born'] = '桃花岛'
huangrong
# 删除某个属性
del huangrong['born']
huangrong
# 返回节点中 property 的个数
len(huangrong)
此时的节点已经创建在本地,但还没有上传到 Neo4j
数据库中,因此在 Neo4j
客户端中是没有任何内容的,所以接下来使用 Graph
中的 create
方法来上传数据。
# 在 Neo4j 数据库中创建 郭靖 节点
graph.create(guojing)
# 在 Neo4j 数据库中创建 黄蓉 节点
graph.create(huangrong)
# 在 Neo4j 数据库中创建 射雕英雄传 节点
graph.create(shediao)
# 打印结果
guojing,huangrong,shediao
此时可以看到每个节点被赋予了 <id>
的属性,即节点前的 _数字
表示为数据库中的唯一标识 <id>
,同时查看 Neo4j
客户端就可以看到这三个节点已经被正确创建了。
在这里,如果重复 create
同一个节点,如:
# 反复执行此命令来创建 郭靖 节点
graph.create(guojing)
实际上在 Neo4j
数据库中并不会重复创建,因为在上传 guojing
节点时,变量的 <id>
属性已经固定,所以不会重复。如果重新定义一个 guojing
节点
# 重新 guojing 变量赋值
guojing = Node('角色',name='郭靖',sex='男')
guojing
节点前的 <id>
属性被抹去,此时在上传,数据库中就会存在两个相同节点了,若要避免这种情况,就需要用到 Graph
中的 merge
方法了。
创建关系
通过从 py2neo
库中导入 Relationship
来创建关系 Relationship
依次接收三个参数:节点-关系-节点,返回 (节点)-[关系]->(节点) 的结果
from py2neo import Relationship
# 创建郭靖与黄蓉的配偶关系
spouse1 = Relationship(guojing,'配偶',huangrong)
# 创建黄蓉与郭靖的配偶关系
spouse2 = Relationship(huangrong,'配偶',guojing)
# 创建郭靖与射雕英雄传的所在作品关系
inbook1 = Relationship(guojing,'所在作品',shediao)
# 创建黄蓉与射雕英雄传的所在作品关系
inbook2 = Relationship(huangrong,'所在作品',shediao)
# 打印结果
spouse1,spouse2,inbook1,inbook2
对于 Relationship,也有很多类似于 Node 的操作,如:
# 设置 key 对应属性的 value
inbook1['role'] = '男主角'
inbook1
# 删除某个属性
del inbook1['role']
inbook1
与创建节点同理,用 create
将关系上传到数据库中
# 创建郭靖与黄蓉的配偶关系
graph.create(spouse1)
# 创建黄蓉与郭靖的配偶关系
graph.create(spouse2)
# 创建郭靖与射雕英雄传的所在作品关系
graph.create(inbook1)
# 创建黄蓉与射雕英雄传的所在作品关系
graph.create(inbook2)
此时查看 Neo4j
客户端就可以看到四个关系已经被正确创建了。
查找
在 py2neo
中提供了 NodeMatcher
来进行图的查找
from py2neo import NodeMatcher
# 初始化一个 matcher 实例
matcher = NodeMatcher(graph)
# 用 match 方法查找 角色 中 name 为郭靖的节点,返回一个 NodeMatch 对象
result = matcher.match("角色", name="郭靖")
# first 方法返回查询结果的第一个
result.first()
# 通过 list 来把所有结果显示出来
list(result)
执行 Cypher 命令
Graph
同时提供 run
方法来直接执行 Cypher
语句。
# cypher 语句,对已存在的 郭靖 节点,创建节点和关系 (郭靖)-[父]->(郭啸天)
query = "match (n) where n.name = '郭靖' create (n)-[:父]->(:角色{name:'郭啸天'})"
# 执行 cypher 语句
graph.run(query)
在 Neo4j
客户端可以看到 郭啸天
的节点和关系已被创建
run
方法返回的是游标 cursors
,cursors
必须通过遍历来展示结果
# cypher 语句,查询并返回所有的节点
query = "match (n) return n"
# 执行 cypher 语句,获得返回结果
cursors = graph.run(query)
# 通过遍历的方式取出所有结果
for i in cursors:
print(i)
总结
文章介绍了 Neo4j
数据库的 python
驱动 py2neo
的基本使用方法,在实际应用中,由于 python
胶水语言的特性,py2neo
可以搭配其他库方便地对知识图谱进行创建。比如在数据集中存在重复数据的情况,可以先用 python
进行一遍去重,再提交,比用 Cypher
语言去重速度更快。然而在数据量特别大的情况下,py2neo
的速度就没有那么快了。
如何批量导入大量数据,参考下篇博文。
感谢!
加油!
以上是关于知识图谱Python.py2neo操作Neo4j的主要内容,如果未能解决你的问题,请参考以下文章
Pyhton操作Neo4j图数据库实践(南北朝隋唐历史北朝主要人物知识图谱)
Pyhton操作Neo4j图数据库实践(南北朝隋唐历史北朝主要人物知识图谱)