2012-06-18 88 views
9

有沒有辦法使用py2neo遍歷neo4j數據庫中的每個節點?是否有可能通過py2neo遍歷所有節點

我的第一個想法是迭代通過GraphDatabaseService,但沒有奏效。如果沒有辦法用py2neo來做,有沒有另一個python界面可以讓我?

編輯:我現在接受@ Nicholas的答案,但如果有人能給我一種返回發電機的方法,我會更新它。

回答

12

我建議這樣做異步Cypher支架,像:

from py2neo import neo4j, cypher 

    graph_db = neo4j.GraphDatabaseService() 

    def handle_row(row): 
     node = row[0] 
     # do something with `node` here 

    cypher.execute(graph_db, "START z=node(*) RETURN z", row_handler=handle_row) 

當然,你可能要排除的參考節點或以其他方式調整查詢。

Nige

+1

謝謝,看起來像這樣的作品。我假設一個大圖不會立即將它們全部加載到python內存中,對嗎? – beardc

+0

正確。異步的Cypher執行從HTTP響應流接收到的每一行都進行處理。 –

+2

從py2neo 1.6(2013年10月發佈)開始,這可以通過一組流行的Cypher查詢結果和標準的Python迭代來實現。 –

4

想到兩種解決方案之一。要麼做一個暗號查詢

START n=node(*) return n 

其他的,我不熟悉Python,所以我打算給Java中的例子是

GlobalGraphOperations.at(graphDatabaseService).getAllNodes() 

這是舊的過時的方式建議使用graphDatabaseService.getAllNodes()

+0

謝謝。執行密碼查詢'START n = node(*)return n'返回一個列表,但是找不到第二個答案的類比。現在接受返回生成器的答案。 – beardc

+0

我已經考慮了實現生成器來遍歷數據庫中所有節點的幾個選項。不幸的是,我不認爲有一種方法可以實現這一點,(i)保持HTTP連接處於打開狀態,直到應用程序代碼遍歷所有項目或者(ii)事先將所有項目加載到內存中。生成器方法的關鍵問題是遍歷必須由使用生成器的代碼來代替_providing_它來控制。這就是爲什麼我覺得回調機制更適合這個目的。 –

2

對於較新版本的py2neo,接受的版本不再有效。相反使用:

from py2neo import Graph 

graph = Graph("http://user:[email protected]:7474/db/data/") 

for n in graph.cypher.stream("START z=node(*) RETURN z"): 
    //do something with node here 
    print n