2012-06-18 3 views
9

Есть ли способ перебора каждого узла в базе данных neo4j с использованием py2neo?Можно ли перебирать все узлы с py2neo

Моя первая мысль была итерацией через GraphDatabaseService, но это не сработало. Если нет способа сделать это с py2neo, есть ли еще один интерфейс python, который позволил бы мне?

Редактировать: Я принимаю ответ Николаса на данный момент, но я обновлю его, если кто-то может дать мне способ, который возвращает генератор.

ответ

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 года) это будет возможно с потоковым набором результатов запроса Cypher и стандартной итерацией Python. –

4

На ум приходит одно из двух решений. Либо сделать запрос Cypher

START n=node(*) return n 

Другой, и я не знаком с питоном, так что я собираюсь дать пример в Java является

GlobalGraphOperations.at(graphDatabaseService).getAllNodes() 

, который является способом старый осуждается graphDatabaseService.getAllNodes() рекомендует.

+0

Спасибо. Выполнение запроса cypher 'START n = node (*) return n' возвращает список, но не смог найти аналог вашего второго ответа. Теперь принимаем ответы, возвращающие генераторы. – beardc

+0

Я рассмотрел несколько вариантов реализации генератора для итерации, хотя все узлы в базе данных. К сожалению, я не думаю, что есть способ достичь этого без (i) сохранения HTTP-соединения до тех пор, пока код приложения не повторится через все элементы или (ii) не будет загружать все элементы в память заранее. Ключевая проблема с подходом генератора заключается в том, что этот обход обязательно управляется кодом _using_ генератора, а не _providing_ it. Вот почему я считаю, что для этой цели предпочтительным является механизм обратного вызова. –

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 
Смежные вопросы