一、基础环境准备

1.1 创建 Conda 虚拟环境

  • 打开终端/命令行,输入:
1
conda create -n neo4j_env python=3.11 -y

-n neo4j_env:环境名称(可自定义,如 my_neo4j_env)。

python=3.11.0:指定 Python 版本(本次采用3.11.0)。

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

  • 激活环境
1
conda activate neo4j_env  # Windows/macOS/Linux 通用命令

1.2 安装 Py2neo 库

安装最新py2neo版本的命令:

1
2
# 或安装最新版(适合 Neo4j 5.x)
pip install py2neo

图片

1.3 验证安装

在 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())

图片

可以看到,已经成功连接neo4j数据库。

二、neo4j的基础语法

2.1  创建节点与关系

2.1.1 创建节点

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

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

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


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


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

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

图片

2.1.2 创建关系

在此之前,我们先清空neo4j内的所有数据,使用以下CQL语句:

1
2
MATCH (n)
DETACH DELETE n

图片

清除之后,数据库内再无任何实体。

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

创建代码如下:

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", "neo4j1234"))


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

图片

2.1.3 注意事项

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

我们再次执行2.1.2的代码,可以看到Alice和Bob再次形成新的实体,且id是不一样的。

图片

2.2  merge的使用

2.2.1 注意事项graph.create()的缺点

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

实际上,多数情况下,这并不是我们想要的结果,我们想要的是即使多次执行,仍然只创建一组实体。

对于此,我们可以采用merge函数来解决这个问题。

2.2.2 merge的效果

  • 存在则匹配:若指定模式已存在,则直接匹配并返回结果。
  • 不存在则创建:若模式不存在,则创建该模式的所有元素(节点、关系及属性)。

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

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

2.2.3 merge的python代码

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


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


# 创建节点间关系
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,"Person","name") # 提交关系

即使我们多次执行此代码,也仅形成一个实体关系对。

图片

2.3  实体的查询

2.3.1 查询节点

通过NodeMatcher去匹配节点。

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


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


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


print(result)

图片

2.3.2 查询关系

通过RelationshipMatcher去匹配关系。

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


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


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


print(relations)

图片

2.4  删除实体与关系

2.4.1 删除实体

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

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

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


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


# 按条件删除节点
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
14
15
from py2neo import Graph, Node, NodeMatcher,Relationship,RelationshipMatcher


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




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

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

图片

2.4.3 删除所有数据

graph.delete_all()可以删除数据库内所有数据,一定要慎用。