2012-06-18 10 views
9

¿Hay alguna manera de iterar a través de cada nodo en una base de datos neo4j usando py2neo?¿Es posible iterar a través de todos los nodos con py2neo

Mi primer pensamiento fue iterar a través de GraphDatabaseService, pero eso no funcionó. Si no hay una manera de hacerlo con py2neo, ¿hay otra interfaz de Python que me permita?

Edit: Estoy aceptando la respuesta de @ Nicholas por el momento, pero la actualizaré si alguien puede darme una forma que devuelva un generador.

Respuesta

12

Yo sugeriría hacer eso con asíncrona de Cypher, algo así como:

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) 

Por supuesto, es posible que desee excluir al nodo de referencia o de otra manera modificar la consulta.

Nige

+1

Gracias, parece que esto funciona. Supongo que para un gráfico grande no los cargará todos en la memoria de Python a la vez, ¿correcto? – beardc

+0

Correcto. La ejecución asincrónica de Cypher envía cada fila para su manejo a medida que se recibe de la secuencia de respuesta HTTP. –

+2

A partir de py2neo 1.6 (que se lanzará en octubre de 2013), esto será posible con un conjunto de resultados de consulta de Cypher y una iteración estándar de Python. –

4

Una de las dos soluciones viene a la mente. O bien hacer una consulta Cypher

START n=node(*) return n 

El otro, y no estoy familiarizado con Python, así que voy a dar el ejemplo en Java es

GlobalGraphOperations.at(graphDatabaseService).getAllNodes() 

que es la forma en que el viejo obsoleto graphDatabaseService.getAllNodes() recomienda.

+0

Gracias. Ejecutando la consulta de cifrado 'START n = node (*) return n' devuelve una lista, pero no pudo encontrar un análogo a su segunda respuesta. Ahora acepta respuestas que devuelven generadores. – beardc

+0

He considerado varias opciones para implementar un generador para iterar a través de todos los nodos en la base de datos. Desafortunadamente, no creo que haya una forma de lograr esto sin (i) mantener la conexión HTTP abierta hasta que el código de la aplicación haya iterado a través de todos los elementos o (ii) cargar todos los elementos en la memoria de antemano. El problema clave con el enfoque del generador es que ese recorrido se controla necesariamente mediante el código _utilizando_ el generador en lugar de eso _ proporcionándolo. Es por eso que creo que el mecanismo de devolución de llamada es preferible para este propósito. –

2

Para las versiones más recientes de py2neo la versión aceptada ya no funciona. En su lugar use:

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 
Cuestiones relacionadas