2012-06-18 7 views
9

C'è un modo per scorrere tutti i nodi in un database neo4j usando py2neo?E 'possibile iterare attraverso tutti i nodi con py2neo

Il mio primo pensiero è stato l'iterazione tramite GraphDatabaseService, ma non ha funzionato. Se non c'è un modo per farlo con py2neo, c'è un'altra interfaccia python che mi permetterebbe?

Modifica: Per ora accetto la risposta di Nicholas, ma la aggiornerò se qualcuno mi può fornire un modo che restituisca un generatore.

risposta

12

Vorrei suggerire a farlo con asincrono Cypher, qualcosa di simile:

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) 

Naturalmente si potrebbe desiderare di escludere il nodo di riferimento o in altro modo modificare la query.

Nige

+1

Grazie, sembra che funzioni. Suppongo che per un grafico di grandi dimensioni non li caricherà tutti nella memoria di Python in una volta, giusto? – beardc

+0

corretto. L'esecuzione asincrona di Cypher invia ciascuna riga per la gestione man mano che viene ricevuta dal flusso di risposta HTTP. –

+2

A partire da py2neo 1.6 (la cui uscita è prevista per ottobre 2013) ciò sarà possibile con una serie di risultati di query Cypher e un'iterazione standard di Python. –

4

Una delle due soluzioni mi viene in mente. O fare una query cifra

START n=node(*) return n 

L'altro, e io non sono a conoscenza di pitone così ho intenzione di dare l'esempio in Java è

GlobalGraphOperations.at(graphDatabaseService).getAllNodes() 

che è il modo in cui il vecchio deprecato graphDatabaseService.getAllNodes() consiglia.

+0

Grazie. Eseguendo la query di cypher 'START n = node (*) return n' restituisce una lista, ma non è stato possibile trovare un analogo alla seconda risposta. Ora accettando le risposte che restituiscono i generatori. – beardc

+0

Ho preso in considerazione diverse opzioni per l'implementazione di un generatore per l'iterazione di tutti i nodi nel database. Sfortunatamente, non credo che ci sia un modo per raggiungere questo obiettivo senza (i) mantenendo aperta la connessione HTTP finché il codice dell'applicazione non ha iterato attraverso tutti gli elementi o (ii) caricando tutti gli elementi in memoria in anticipo. Il problema chiave dell'approccio generatore è che l'attraversamento è necessariamente controllato dal codice _using_ il generatore invece di quello _providing_ it. Questo è il motivo per cui ritengo che il meccanismo di callback sia preferibile a questo scopo. –

2

Per le versioni più recenti del py2neo la versione accettata non funziona più. Utilizzare invece:

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