知识图谱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进行科学计算和交互可视化的一个最佳的平台。

IPython介绍

安装 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 方法返回的是游标 cursorscursors 必须通过遍历来展示结果

# 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图数据库实践(南北朝隋唐历史北朝主要人物知识图谱)

知识图谱Py2neo操作Neo4j使用教程

Pyhton操作Neo4j图数据库实践(南北朝隋唐历史北朝主要人物知识图谱)

知识图谱Neo4j基本操作及数据库文件导入(graph.db.dump)

Neo4j的查询语法笔记

Neo4j的查询语法笔记