使用Python操作Neo4j

一、基礎環(huán)境準備
1.1 創(chuàng)建 Conda 虛擬環(huán)境
- 打開終端/命令行,輸入:
conda create -n neo4j_env python=3.9 -y-n neo4j_env:環(huán)境名稱(可自定義,如 my_neo4j_env)。
python=3.11.0:指定 Python 版本(本次采用3.11.0)。
-y:自動確認安裝依賴。
- 激活環(huán)境
conda activate neo4j_env # Windows/macOS/Linux 通用命令1.2 安裝 Py2neo 庫
安裝最新py2neo版本的命令:
# 或安裝最新版(適合 Neo4j 5.x)
pip install py2neo
1.3 驗證安裝
在 Python 交互環(huán)境中測試:
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 創(chuàng)建節(jié)點與關系
2.1.1 創(chuàng)建節(jié)點
創(chuàng)建一個Person的節(jié)點,名字是Alice。相當于Alice被劃分為Person這個類別。
對于Person節(jié)點,有name和age兩個屬性。
from py2neo import Graph, Node
# 連接 Docker 內的 Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "neo4j1234"))
# 創(chuàng)建節(jié)點
node = Node("Person", name="Alice", age=30)
graph.create(node)在neo4j內,每一個點稱作一個實體(節(jié)點),Alice就是一個實體,擁有age和name兩個屬性。

2.1.2 創(chuàng)建關系
在此之前,我們先清空neo4j內的所有數據,使用以下CQL語句:
MATCH (n)
DETACH DELETE n
清除之后,數據庫內再無任何實體。
然后,我們開始創(chuàng)建Alice與Bob的關系,設定他們是朋友關系,指向關系為:alice->bob;since表示朋友關系的開始時間。
創(chuàng)建代碼如下:
from py2neo import Graph, Node, NodeMatcher,Relationship
# 連接 Docker 內的 Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "neo4j1234"))
# 創(chuàng)建節(jié)點間關系
alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
relation = Relationship(alice, "FRIEND", bob, since=2025)
graph.create(relation) # 提交關系
2.1.3 注意事項
重復執(zhí)行創(chuàng)建關系,并不會覆蓋,而是會新建節(jié)點與關系。
我們再次執(zhí)行2.1.2的代碼,可以看到Alice和Bob再次形成新的實體,且id是不一樣的。

2.2 merge的使用
2.2.1 注意事項graph.create()的缺點
在通過graph.create()進行節(jié)點、關系創(chuàng)建時,多次執(zhí)行后,我們會重復創(chuàng)建相同的節(jié)點與關系。
實際上,多數情況下,這并不是我們想要的結果,我們想要的是即使多次執(zhí)行,仍然只創(chuàng)建一組實體。
對于此,我們可以采用merge函數來解決這個問題。
2.2.2 merge的效果
- 存在則匹配:若指定模式已存在,則直接匹配并返回結果。
- 不存在則創(chuàng)建:若模式不存在,則創(chuàng)建該模式的所有元素(節(jié)點、關系及屬性)。
在py2neo中,merge 會檢查實體的 is_bound 狀態(tài)(是否已綁定到數據庫)。若實體未綁定(即未預先提交),則會自動創(chuàng)建并綁定實體,再創(chuàng)建關系。
簡單來說,若實體存在,就不再次創(chuàng)建實體,直接創(chuàng)建關系;如果不存在,就先創(chuàng)建實體再創(chuàng)建關系。
2.2.3 merge的python代碼
from py2neo import Graph, Node, NodeMatcher,Relationship
# 連接 Docker 內的 Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "neo4j1234"))
# 創(chuàng)建節(jié)點間關系
alice = Node("Person", name="Alice")
bob = Node("Person", name="Bob")
relation = Relationship(alice, "FRIEND", bob, since=2026)
graph.merge(alice,"Person","name") # 提交節(jié)點
graph.merge(bob,"Person","name") # 提交節(jié)點
graph.merge(relation,"Person","name") # 提交關系即使我們多次執(zhí)行此代碼,也僅形成一個實體關系對。

2.3 實體的查詢
2.3.1 查詢節(jié)點
通過NodeMatcher去匹配節(jié)點。
from py2neo import Graph, Node, NodeMatcher,Relationship,RelationshipMatcher
# 連接 Docker 內的 Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "neo4j1234"))
# 使用NodeMatcher
matcher = NodeMatcher(graph)
# 匹配name=Alice的節(jié)點
result = matcher.match("Person").where("_.name = 'Alice'").all()
print(result)
2.3.2 查詢關系
通過RelationshipMatcher去匹配關系。
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()刪除指定實體,當實體被刪除后,其關系將自動被刪除。
本質:匹配到指定節(jié)點,然后用delete刪除。
from py2neo import Graph, Node, NodeMatcher,Relationship
# 連接 Docker 內的 Neo4j
graph = Graph("bolt://localhost:7687", auth=("neo4j", "neo4j1234"))
# 按條件刪除節(jié)點
matcher = NodeMatcher(graph)
# 匹配第一個Alice的Person節(jié)點
node = matcher.match("Person", name="Alice").first()
if node:
graph.delete(node) # 自動刪除關聯(lián)關系在刪除Alice實體后,Alice實體的關系也被刪除,僅保留Bob實體。

2.4.2 刪除關系
通過graph.delete()刪除指定關系,實體會被保留。
本質:匹配到指定關系,然后用delete刪除。
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) # 僅刪除關系,保留節(jié)點可以看到,實體間關系被刪除,但是實體得以保留。

2.4.3 刪除所有數據
graph.delete_all()可以刪除數據庫內所有數據,一定要慎用。
































