文章主要参考微信公众号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-2-安装 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

如果显示无法识别为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__) # 应显示安装版本号
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
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
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
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))
matcher = NodeMatcher(graph)
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
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))
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
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))
matcher = NodeMatcher(graph)
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
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))
rel_matcher = RelationshipMatcher(graph)
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
graph = Graph("bolt://localhost:7687", auth=("neo4j", "12345678"))
graph.delete_all()
result = graph.run("MATCH (n) RETURN COUNT(n) AS node_count") print("剩余节点数量:", result.evaluate())
|
运行后

输出结果
