02-使用python操作neo4j

文章主要参考微信公众号Python伊甸园的文章《使用python操作neo4j》^[https://mp.weixin.qq.com/s/by6qzy7Omkv-tDAtt1muow]

一、基础环境准备

1-1-创建 Conda 虚拟环境

打开终端/命令行,输入:

1
conda create -n name python=3.11 -y

name:环境名称,可自定义,如neo4j。

python=3.11:指定Python版本。

-y:自动确认安装依赖。

激活环境

1
conda activate neo4j

1-2-安装 Py2neo 库

在终端输入

1
pip install py2neo

1-3-安装neo4j

文章主要参考知乎watersprite的文章《windows下安装neo4j community版详细步骤(知识图谱 一)》^[https://zhuanlan.zhihu.com/p/26634070689]

要搞清楚特定neo4j版本对应的java版本,两者之间版本需要对应

java 下载路径:jdk

neo4j下载路径:neo4j

1-3-1-java环境安装及配置

打开安装包

进入安装程序

1-3-2-安装neo4j

解压neo4j-community-5.15.0-windows.zip文件到目标地址

进入neo4j的解压文件夹,然后进入bin目录,复制该路径

编辑PATH变量,再新增一个环境变量

打开cmd,输入neo4j console

1
neo4j console

如果显示无法识别为cmdlet、函数、脚本文件或可运行程序的名称可以重启电脑再次尝试

打开给出的地址,可以进入后台

1-3-3-测试neo4j

创建并登录库,具体界面如下图所示,用户名写neo4j,原始密码为neo4j,点击connect后进入设置新密码页面。

密码修改完毕

进入数据库

此处为命令行

输入下面两行代码创建两个节点,然后点击运行

1
2
create (p1:Person {name:"zs"}) 
create (p2:Person {name:"ls"})

运行结果如下图所示

使用下面代码创建两个边

1
create (p1:Person {name:"zs"}) -[:like]-> (p2:Person {name:"ls"})

点击关系类型中like关系,可显示显示图结构

1-4-验证安装

在 Python 交互环境中测试:(别忘把代码中”你的密码“这一项修改

1
2
3
4
5
6
from py2neo import __version__
print("Py2neo 版本:", __version__) # 应显示安装版本号
# 连接 Neo4j 测试(确保本地 Neo4j 服务已启动)
from py2neo import Graph
graph = Graph("bolt://localhost:7687", auth=("neo4j", "你的密码"))
print(graph.run("RETURN '连接成功'").data())

如果直接运行会显示

1
py2neo.errors.ConnectionUnavailable: Cannot open connection to ConnectionProfile('bolt://localhost:7687')

需要先在后台打开数据库,还是输入neo4j console

正常运行

二、neo4j的基础语法

2-1-创建节点与关系

2-1-1-创建节点

创建一个Person的节点,名字是Alice。相当于Alice被划分为Person这个类别。

对于Person节点,有name和age两个属性。

1
2
3
4
5
6
7
8
from py2neo import Graph, Node

# 连接 Docker 内的 Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))

# 创建节点
node = Node("Person", name="Alice", age=30)
graph.create(node)

在neo4j内,每一个点称作一个实体(节点),Alice就是一个实体,拥有age和name两个属性。

运行后,效果如下图

2-1-2-清空neo4j数据

在neo4j后台中输入

1
2
MATCH (n)
DETACH DELETE n

结果如下

2-1-3-创建关系

创建Alice与Bob的关系,设定他们是朋友关系,指向关系为:alice->bob;since表示朋友关系的开始时间。

1
2
3
4
5
6
7
8
9
10
from py2neo import Graph, Node, NodeMatcher,Relationship

# 连接Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))

# 创建节点间关系
alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
relation = Relationship(alice, "FRIEND", bob, since=2025)
graph.create(relation) # 提交关系

运行后

2-1-4-重复执行

重复执行创建关系,并不会覆盖,而是会新建节点与关系。

再次执行2-1-3的代码,Alice和Bob再次形成新的实体,且id不同。

1
2
3
4
5
6
7
8
9
10
from py2neo import Graph, Node, NodeMatcher,Relationship

# 连接Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))

# 创建节点间关系
alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
relation = Relationship(alice, "FRIEND", bob, since=2025)
graph.create(relation) # 提交关系

2-2-merge()创建节点和关系

2-2-1-creat()的缺点

在通过graph.create()进行节点、关系创建时,多次执行后,会重复创建节点与关系。

而多数情况下,我们想要的是多次执行,仍然只创建一组实体,可以采用merge函数来解决这个问题。

2-2-2-merge()的效果

存在则匹配:若指定模式已存在,则直接匹配并返回结果。

不存在则创建:若模式不存在,则创建该模式的所有元素(节点、关系及属性)。

在py2neo中,merge 会检查实体的 is_bound 状态(是否已绑定到数据库)。若实体未绑定(即未预先提交),则会自动创建并绑定实体,再创建关系。

简单来说,若实体存在,就不再次创建实体,直接创建关系;如果不存在,就先创建实体再创建关系。

2-2-3-代码测试

多次执行下述代码,也仅形成一个实体关系对。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from py2neo import Graph, Node, Relationship

graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))

alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
relation = Relationship(alice, "FRIEND", bob, since=2026)

# 合并节点
graph.merge(alice, "Person", "name")
graph.merge(bob, "Person", "name")

# 创建关系
graph.merge(relation)

2-3-实体的查询

2-3-1-查询节点

通过NodeMatcher去匹配节点。

1
2
3
4
5
6
7
8
9
10
11
from py2neo import Graph, Node, NodeMatcher,Relationship,RelationshipMatcher

# 连接Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))

# 使用NodeMatcher
matcher = NodeMatcher(graph)
# 匹配name=Alice的节点
result = matcher.match("Person").where("_.name = 'Alice'").all()

print(result)

得到结果

1
[Node('Person', name='Alice')]

2-3-2-查询关系

通过RelationshipMatcher去匹配关系。

1
2
3
4
5
6
7
8
9
10
from py2neo import Graph, Node, NodeMatcher,Relationship,RelationshipMatcher

# 连接Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))

# 使用RelationshipMatcher
rel_matcher = RelationshipMatcher(graph)
relations = rel_matcher.match(r_type="FRIEND").all()

print(relations)

得到结果

1
[FRIEND(Node('Person', name='Alice'), Node('Person', name='Bob'), since=2026)]

2-4-删除实体与关系

2-4-1-删除实体

通过graph.delete()删除指定实体,当实体被删除后,其关系将自动被删除。

本质:匹配到指定节点,然后用delete删除。

1
2
3
4
5
6
7
8
9
10
11
12
from py2neo import Graph, Node, NodeMatcher, Relationship

# 连接 Docker 内的 Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))

# 按条件删除节点
matcher = NodeMatcher(graph)
# 匹配第一个Alice的Person节点
node = matcher.match("Person", name="Alice").first()
if node:
graph.delete(node) # 自动删除关联关系

在删除Alice实体后,Alice实体的关系也被删除,仅保留Bob实体。

2-4-2-删除关系

通过graph.delete()删除指定关系,实体会被保留。

本质:匹配到指定关系,然后用delete删除。

1
2
3
4
5
6
7
8
9
10
11
12
13
from py2neo import Graph, Node, NodeMatcher, Relationship, RelationshipMatcher

# 连接Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))


# 删除特定关系
rel_matcher = RelationshipMatcher(graph)
# 匹配FRIEND的关系
relation = rel_matcher.match(r_type="FRIEND").first()
if relation:
graph.separate(relation) # 仅删除关系,保留节点

运行前

运行后

实体间关系被删除,但是实体得以保留。

2-4-3-删除所有数据

graph.delete_all()可以删除数据库内所有数据。

1
2
3
4
5
6
7
8
9
10
11
from py2neo import Graph

# 1. 连接 Neo4j 数据库
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))

# 2. 删除所有节点和关系(谨慎操作!)
graph.delete_all() # 执行后数据库将被清空

# 3. 验证删除结果(可选)
result = graph.run("MATCH (n) RETURN COUNT(n) AS node_count")
print("剩余节点数量:", result.evaluate()) # 输出应为 0

运行后

输出结果

1
剩余节点数量: 0


02-使用python操作neo4j
https://pattianfang.github.io/2025/08/07/02-使用python操作neo4j/
作者
Pat Tian Fang
发布于
2025年8月7日
更新于
2025年8月7日
许可协议