py2neo

通用

# -*- coding: UTF-8 -*-
from py2neo import Graph, Node, Relationship, walk, NodeMatcher, RelationshipMatcher, Subgraph graph = Graph("http://localhost:7474", username="neo4j", password="123456")

# 建立節點
node1 = Node('Person' , name = 'Bob')
node2 = Node('Person' , name = 'Alice')
graph.create(node1)
graph.create(node2) # 建立關係
r1 = Relationship(node2 , 'know' , node1)
graph.create(r1) # 設定節點屬性
node1['age'] = 21
node1['height'] = 180
graph.push(node1) data = {
'age':24,
'height':177
}
node2.update(data)
graph.push(node2) # 設定關係屬性
r1['level'] = 'familiar'
graph.push(r1)

  • 查節點
# 查詢標籤為Person,屬性name="Alice"的節點,並返回第一個結果
graph.nodes.match("Person", name="Alice").first() # 查詢所有標籤為Person,name以B開頭的節點,並將結果按照age欄位排序
res = graph.nodes.match("Person").where("_.name =~ 'B.*'").order_by('_.age') # 查詢id為4的節點
t_node = graph.nodes[4]

graph.evaluate()執行一個Cypher語句並返回結果的第一條資料

# 執行Cypher語句並返回結果集的第一條資料
res = graph.evaluate('MATCH (p:Person) return p')
# 輸出:(_3:Person {age: 20, name: 'Bob'})
print(res)
  • 查關係

graph.match(nodes=None, r_type=None, limit=None)查詢符合條件的關係,第一個引數為節點集合或者集合(起始節點,終止節點),如果省略代表所有節點。第二個引數為關係的屬性,第三個為返回結果的數量。也可以使用match_one()代替,返回一條結果。

# 查詢id為196的關係
rel = graph.relationships[196] # 查詢所有以a為起點,並且屬性為know的關係
res = graph.match((a, ), r_type="know")
# 列印關係的終止節點,即為a所有認識的人
for rel in res:
print(rel.end_node["name"])
  • 查子圖

graph.run()執行Cypher語句並返回結果資料流的遊標Cursor,通過forward()方法不斷向前移動遊標可以向前切換結果集的每條記錄Record物件.

# 查詢(p1)-[k]->(p2),並返回所有節點和關係
gql="MATCH (p1:Person)-[k:know]->(p2:Person) RETURN *"
cursor=graph.run(gql)
# 迴圈向前移動遊標
while cursor.forward():
# 獲取並列印當前的結果集
record=cursor.current
print(record) # 還可以將graph.run()返回的結果通過data()方法轉化為字典列表,所有結果整體上是一個列表,其中每一條結果是字典的格式
# 查詢(p1)-[k]->(p2),並返回所有節點和關係
gql = "MATCH (p1:Person)-[k:know]->(p2:Person) RETURN *"
res = graph.run(gql).data()
print(res) # 通過graph.run().to_subgraph()方法將返回的結果轉化為SubGraph物件,接著按之前操作SubGraph物件的方法取得節點物件
# 查詢(p1)-[k]->(p2),並返回所有節點和關係
gql = "MATCH (p1:Person)-[k:know]->(p2:Person) RETURN *"
sub_graph = graph.run(gql).to_subgraph()
# 獲取子圖中所有節點物件並列印
nodes=sub_graph.nodes
for node in nodes:
print(node)
  • 通過屬性值來查詢節點和關係(find,find_one)
node1 = graph.find_one(
label="Person",
property_key="name",
property_value="Bob"
)
print(node1['name'])
  • 補充
# 查
data1 = test_graph.run('MATCH (a:人) RETURN a') # 返回的是cursor物件
data1 = data1.data() # 返回的是list
print(data1, type(data1)) # 查節點
print(pd.DataFrame(test_graph.nodes.match('人'))) print(pd.DataFrame(test_graph.nodes.match('人', name='莎莎'))) # 查關係 print(list(test_graph.match(r_type='喜歡'))) # py2neo提供了專門的查詢模組 NodeMatcher節點 RelationshipMatcher關係
# ================== 測試NodeMatcher
nodeMatcher = NodeMatcher(test_graph)
node = nodeMatcher.match('人')
print(pd.DataFrame(list(node))) # 返回列表的第一個節點
node = nodeMatcher.match('人').first()
print(node)
# 返回列表中age為21的節點
node = nodeMatcher.match('人').where(age=21)
print(list(node))
————————————————
版權宣告:本文為CSDN博主「luer9」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/qq_40046426/article/details/112837659

# 刪除節點
node3 = Node('animal' , name = 'cat')
graph.create(node3)
graph.delete(node3) # 刪除子圖
gql = "MATCH (p1:Person)-[k:know]->(p2:Person) RETURN *"
sub_graph = graph.run(gql).to_subgraph()
graph.delete(sub_graph)
# 刪除所有圖
graph.delete_all()
# 刪除關係rel
# 查詢所有以a為起點,並且屬性為know的關係
res = graph.match((a, ), r_type="know")
for rel in res:
graph.separate(rel)

先查到指定節點,然後直接修改屬性後使用graph.push(node)即可

from py2neo import Graph, NodeMatcher, Subgraph

tx = graph.begin()
# 找到你要找的Nodes
matcher = NodeMatcher(graph)
nodes = matcher.match("User")
# 將返回的“Match”類轉成list
new_nodes = list(nodes)
## 新增你要修改的東西
for node in new_nodes:
node['tag'] = node['tag'].split(',')
# 裡面是Node的list可以作為Subgraph的引數
sub = Subgraph(nodes=new_nodes)
# 呼叫push更新
tx.push(sub)
tx.commit()