Python + py2neo 对接 Neo4j:节点、关系、属性增删改查入门
如果你刚开始学习知识图谱、图数据库,Neo4j 基本绕不开。
Neo4j 里面最核心的东西其实就两个:
- 关系:比如学生选了课程、员工属于公司、电影由某个导演执导。
这篇文章用 Python 连接 Neo4j,带你从安装、连接,到节点、关系、属性的增删改查全部跑一遍。
本文适合初学者,所以不搞复杂配置,不写 .env,不封装类,直接一个 demo.py 文件开跑。
1. 准备环境和安装依赖
先确认 Neo4j 已经启动。
一般本地访问地址是:
http://127.0.0.1:7474/browser/
本文使用的连接信息如下:
账号:neo4j密码:neo4j123456Bolt 地址:bolt://127.0.0.1:7687
Python 这边安装 py2neo:
pip install py2neo
安装完成后,就可以开始写代码了。
2. 第一次连接 Neo4j
新建一个文件,叫 demo.py。
先写最简单的连接测试:
from py2neo import Graphgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))result = graph.run("RETURN 'Neo4j 连接成功' AS message").data()print(result)
运行:
python demo.py
如果看到类似下面的结果,说明 Python 已经连上 Neo4j 了:
[{'message': 'Neo4j 连接成功'}]
3. 清理旧测试数据
为了教程可以反复运行,我们先清理一下本教程创建的示例数据。
注意:这里只删除带有 Student 和 Course 标签的数据。
from py2neo import Graphgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))graph.run("MATCH (n:Student) DETACH DELETE n")graph.run("MATCH (n:Course) DETACH DELETE n")print("测试数据清理完成")
这里用到了 DETACH DELETE,它的意思是:删除节点时,顺便删除这个节点上的关系。
4. 创建节点
节点可以理解为一条数据。
比如创建一个学生节点:
from py2neo import Graph, Nodegraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))student = Node("Student", name="张三", age=18)graph.create(student)print("学生节点创建成功")
这里的 Student 是节点标签,name 和 age 是节点属性。
再创建一门课程:
from py2neo import Graph, Nodegraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))course = Node("Course", name="Python 入门", score=5)graph.create(course)print("课程节点创建成功")
运行到这里,Neo4j 里已经能看到 2 个学生节点和 2 个课程节点:

5. 查询节点
查询一个学生:
from py2neo import Graphgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))student = graph.nodes.match("Student", name="张三").first()print(student)
如果想拿到节点属性:
print(student["name"])print(student["age"])
查询所有学生:
from py2neo import Graphgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))students = graph.nodes.match("Student")for student in students:print(student["name"], student["age"])
6. 修改节点属性
先查到节点,再修改属性,最后用 graph.push() 推送到 Neo4j。
from py2neo import Graphgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))student = graph.nodes.match("Student", name="张三").first()student["age"] = 19student["city"] = "北京"graph.push(student)print("学生属性修改成功")
查看一下:
student = graph.nodes.match("Student", name="张三").first()print(dict(student))
输出大概是:
{'name': '张三', 'age': 19, 'city': '北京'}
7. 删除节点属性
删除属性也很简单,像操作 Python 字典一样:
from py2neo import Graphgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))student = graph.nodes.match("Student", name="张三").first()del student["city"]graph.push(student)print("city 属性删除成功")
8. 删除节点
删除节点使用 graph.delete()。
from py2neo import Graphgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))student = graph.nodes.match("Student", name="张三").first()graph.delete(student)print("学生节点删除成功")
注意:如果这个节点上还有关系,直接删除可能失败。
初学阶段更推荐用 Cypher:
graph.run("MATCH (s:Student {name: '张三'}) DETACH DELETE s")
DETACH DELETE 会先删除关系,再删除节点。
9. 创建关系
关系用来描述两个节点之间的联系。
比如:张三选了 Python 入门课程。
from py2neo import Graph, Node, Relationshipgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))student = Node("Student", name="张三", age=18)course = Node("Course", name="Python 入门", score=5)graph.create(student)graph.create(course)rel = Relationship(student, "SELECTED", course, created_at="2026-05-21")graph.create(rel)print("关系创建成功")
运行后,Neo4j 图谱里会出现学生到课程的 SELECTED 关系:

这段代码创建了:
(张三)-[:SELECTED]->(Python 入门)
关系 SELECTED 上还有一个属性:created_at。
10. 查询关系
查询关系用 Cypher 最直观:
from py2neo import Graphgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))rows = graph.run("""MATCH (s:Student)-[r:SELECTED]->(c:Course)RETURN s.name AS student, c.name AS course, r.created_at AS created_at""").data()for row in rows:print(row)
输出类似:
{'student': '张三', 'course': 'Python 入门', 'created_at': '2026-05-21'}
11. 修改关系属性
关系也可以有属性,比如选课时间、分数、状态。
修改关系属性:
from py2neo import Graphgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))graph.run("""MATCH (:Student {name: '张三'})-[r:SELECTED]->(:Course {name: 'Python 入门'})SET r.score = 95RETURN r""")print("关系属性修改成功")
查询一下:
rows = graph.run("""MATCH (:Student {name: '张三'})-[r:SELECTED]->(:Course {name: 'Python 入门'})RETURN r.created_at AS created_at, r.score AS score""").data()print(rows)
属性更新以后,图谱结构不会变,但节点和关系上的属性已经变化。Neo4j 的图谱状态如下:

12. 删除关系
只删除关系,不删除节点:
from py2neo import Graphgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))graph.run("""MATCH (:Student {name: '张三'})-[r:SELECTED]->(:Course {name: 'Python 入门'})DELETE r""")print("关系删除成功")
删除关系后,学生和课程节点还在,只是它们之间没有这条 SELECTED 关系了。下面这张图可以看到,节点还在,但关系数量变少了:

13. 用 Cypher 做节点增删改查
py2neo 可以用对象方式操作,也可以直接执行 Cypher。
初学者建议两种都了解,但真正写复杂查询时,Cypher 更清楚。
创建节点
graph.run("""CREATE (s:Student {name: '李四', age: 20})RETURN s""")
查询节点
rows = graph.run("""MATCH (s:Student)RETURN s.name AS name, s.age AS age""").data()print(rows)
修改节点
graph.run("""MATCH (s:Student {name: '李四'})SET s.age = 21RETURN s""")
删除节点
graph.run("""MATCH (s:Student {name: '李四'})DETACH DELETE s""")
14. 一个完整小案例
下面这段代码可以直接复制到 demo.py 运行。
它会完成这些事情:
from py2neo import Graph, Node, Relationshipgraph = Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))# 1. 清理旧数据graph.run("MATCH (n:Student) DETACH DELETE n")graph.run("MATCH (n:Course) DETACH DELETE n")# 2. 创建学生节点zhangsan = Node("Student", name="张三", age=18)lisi = Node("Student", name="李四", age=20)graph.create(zhangsan)graph.create(lisi)# 3. 创建课程节点python_course = Node("Course", name="Python 入门", score=5)neo4j_course = Node("Course", name="Neo4j 入门", score=4)graph.create(python_course)graph.create(neo4j_course)# 4. 创建关系rel1 = Relationship(zhangsan, "SELECTED", python_course, created_at="2026-05-21")rel2 = Relationship(zhangsan, "SELECTED", neo4j_course, created_at="2026-05-21")rel3 = Relationship(lisi, "SELECTED", neo4j_course, created_at="2026-05-21")graph.create(rel1)graph.create(rel2)graph.create(rel3)# 5. 查询关系rows = graph.run("""MATCH (s:Student)-[r:SELECTED]->(c:Course)RETURN s.name AS student, c.name AS course, r.created_at AS created_atORDER BY student, course""").data()print("选课结果:")for row in rows:print(row)# 6. 修改节点属性zhangsan["age"] = 19graph.push(zhangsan)# 7. 修改关系属性graph.run("""MATCH (:Student {name: '张三'})-[r:SELECTED]->(:Course {name: 'Python 入门'})SET r.score = 95""")# 8. 删除一条关系graph.run("""MATCH (:Student {name: '张三'})-[r:SELECTED]->(:Course {name: 'Neo4j 入门'})DELETE r""")# 9. 最终查询final_rows = graph.run("""MATCH (s:Student)-[r:SELECTED]->(c:Course)RETURN s.name AS student, s.age AS age, c.name AS course, r.score AS scoreORDER BY student, course""").data()print("最终结果:")for row in final_rows:print(row)
运行后,打开 Neo4j Browser,输入:
MATCH p=(s:Student)-[r:SELECTED]->(c:Course)RETURN p
就能看到学生和课程之间的关系图。
下面是导出的 Neo4j 图谱效果:

15. 常见报错
1. 密码错误
如果看到类似认证失败的信息,先检查这里:
Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))
账号、密码要和你 Neo4j 里设置的一致。
2. Neo4j 没启动
如果提示连接不上,先打开浏览器访问:
http://127.0.0.1:7474/browser/
如果页面打不开,说明 Neo4j 服务还没启动。
3. 端口写错
Neo4j 常见有两个端口:
7474:浏览器页面端口7687:Python 连接用的 Bolt 端口
Python 代码里要写:
Graph("bolt://127.0.0.1:7687", auth=("neo4j", "neo4j123456"))
不要写成 7474。
4. 删除节点失败
如果节点上还有关系,直接删除可能失败。
推荐初学者用:
MATCH (n:Student {name: '张三'})DETACH DELETE n
DETACH DELETE 会把节点和它相关的关系一起删除。
5. 重复创建了很多节点
如果你反复运行 graph.create(),它每次都会创建新节点。
如果想避免重复,可以先清理:
graph.run("MATCH (n:Student) DETACH DELETE n")graph.run("MATCH (n:Course) DETACH DELETE n")
等熟悉以后,再学习唯一约束和 MERGE。
16. 小结
这篇文章我们用 py2neo 完成了 Neo4j 的基础操作:
如果你是初学者,不需要一上来就学很复杂的封装。
先把这几个动作跑通:
节点怎么建节点怎么查属性怎么改关系怎么连关系怎么删Cypher 怎么执行
这些搞明白以后,再去做知识图谱、推荐关系、人物关系、业务链路分析,就会顺很多。
建议你现在就复制完整案例,运行一次,然后去 Neo4j Browser 里看图谱效果。