py2neo 使用教程

Py2neo是Neo4j數(shù)據(jù)庫的python驅(qū)動(dòng)

官方支持的版本

  • Python 2.7 / 3.3 / 3.4 / 3.5
  • Neo4j 2.0 / 2.1 / 2.2 / 2.3 / 3.0

安裝

我使用的版本是python 3.7, neo4j 3.4,目前沒有問題
這里是py2neo v4 handbook
安裝,它會(huì)自動(dòng)安裝依賴包neo4j(就是官方建議的那個(gè)包)

pip3 install py2neo

鏈接

默認(rèn)的端口號(hào)就是7474,最新的鏈接方式是傳入用戶名和密碼的元組

from py2neo import Graph,Node,Relationship
graph = Graph("http://localhost:7474",auth=("neo4j","password"))

創(chuàng)建節(jié)點(diǎn)Node和關(guān)系Relationship

a = Node("Person", name="Alice")
b = Node("Person", name="Bob")
ab = Relationship(a, "KNOWS", b)
graph.create(ab)

Node和Relationship可以定義對(duì)應(yīng)的實(shí)例,Node第一個(gè)參數(shù)是label, 再利用graph.create()創(chuàng)建

數(shù)據(jù)對(duì)象 Object

Node

node是保存在Neo4j里面的數(shù)據(jù)儲(chǔ)存單元,在創(chuàng)建好node后,我們可以有很多操作,比如

#獲取key對(duì)應(yīng)的property
x=node[key] 
 #設(shè)置key鍵對(duì)應(yīng)的value,如果value是None就移除這個(gè)property
node[key] = value
 #也可以專門刪除某個(gè)property
del node[key]
#返回node里面property的個(gè)數(shù)
len(node)
#返回所以和這個(gè)節(jié)點(diǎn)有關(guān)的label
labels=node.labels
#刪除某個(gè)label
node.labels.remove(labelname)
#將node的所有property以dictionary的形式返回
dict(node)

Relationship

對(duì)于relationship,也有很多相似的操作,這里只列舉幾個(gè)

#創(chuàng)建Relationship
Relationship`(*start_node*, *type*, *end_node*, ***properties*)
#返回Relationship的property
Relationship[key]
#刪除某個(gè)property
del Relationship[key]
#將relationship的所有property以dictionary的形式返回
dict(relationship)

PropertyDict:因?yàn)镹ode和Relationship在這個(gè)驅(qū)動(dòng)中都繼承了PropertyDict這個(gè)類,而這個(gè)類繼承類python里面的dict,所以操作和python本身的dict一模一樣

Subgraphs

子圖是節(jié)點(diǎn)和關(guān)系不可變的集合,我們可以通過set operator來結(jié)合,參數(shù)可以是獨(dú)立的node或relationships

subgraph | other | ...      結(jié)合這些subgraphs
subgraph & other & ...   相交這些subgraphs
subgraph - other - ...     不同關(guān)系
#比如我們前面創(chuàng)建的ab關(guān)系
s = ab | ac

查詢 Query

最新的v4版本中,對(duì)node的查詢,已經(jīng)移除原有的find(),可以在nodes中調(diào)用match來找點(diǎn)

graph.nodes.match(self, *labels, **properties): 找到所有的nodes,

或者使用 py2neo.matching包里面的NodeMatcher(graph) 函數(shù)構(gòu)建個(gè)matcher再查詢(其實(shí)上面的方法就調(diào)用的這個(gè)東西), 首先創(chuàng)建Matcher來執(zhí)行查詢,它會(huì)返回一個(gè)Match類型的數(shù)據(jù),可以繼續(xù)使用where(),first(),order_by等操作,可以用list強(qiáng)制轉(zhuǎn)換

graph = Graph()
matcher = NodeMatcher(graph)
matcher.match("Person", name="Keanu Reeves").first()
#結(jié)果 (_224:Person {born:1964,name:"Keanu Reeves"})

# where里面使用_指向當(dāng)前node
list(matcher.match("Person").where("_.name =~ 'K.*'"))

如果要查詢r(jià)elationship,直接在graph里面調(diào)

graph.match(nodes=None, r_type=None, limit=None) 找到所有的relationships

更新 Update

更新先要找出Nodes,再使用事務(wù)的push更新

from py2neo import Graph, NodeMatcher, Subgraph

tx = graph.begin()
# 找到你要找的Nodes
matcher = NodeMatcher(graph)
nodes = matcher.match("User")
# 將返回的“Match”類轉(zhuǎn)成list
new_nodes = list(nodes)
## 添加你要修改的東西
for node in new_nodes:
    node['tag'] = node['tag'].split(',')
# 里面是Node的list可以作為Subgraph的參數(shù)
sub = Subgraph(nodes=new_nodes)
# 調(diào)用push更新
tx.push(sub)
tx.commit()

批處理:

對(duì)于大量的插入一般是很費(fèi)時(shí)的,首先我們可以使用事務(wù),加快一定速度,而插入的方法一樣重要,我們很多時(shí)候是遍歷一個(gè)文件然后生成圖,例子中我們生成每個(gè)Node后,先把他們放入一個(gè)List中,再變?yōu)镾ubgraph實(shí)例,然后再create(),耗時(shí)比一條條插入至少快10倍以上

tx = graph.begin()
nodes=[]
for line in lineLists:
    oneNode = Node()
    ........
    #這里的循環(huán),一般是把文件的數(shù)據(jù)存入node中
    nodes.append(oneNode)
nodes=neo.Subgraph(nodes)
tx.create(nodes)
tx.commit()

前面我們說了關(guān)系的創(chuàng)建,如果在node存進(jìn)去后,再通過py2neo層面的“查找node,create關(guān)系”這樣的效率是很低的,時(shí)間主要花在通過"reference Id"去一個(gè)個(gè)去查找對(duì)應(yīng)的node,然后再和這個(gè)node建立關(guān)系,這里強(qiáng)烈推薦使用原生語句,效率不是一般的高

#假定我們已經(jīng)把兩種node存進(jìn)去了,label分別是Post和User,現(xiàn)在需要在他們間建立某關(guān)系
graph.run("MATCH (p:Post),(u:User) \
                WHERE p.OwnerUserId = u.Id \
                CREATE (u)-[:Own]->(p)")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容