Запрос на основе курсора Neo4J / py2neo?

Если я сделаю что-то вроде этого:

from py2neo import Graph
graph = Graph()
stuff = graph.cypher.execute("""
    match (a:Article)-[p]-n return a, n, p.weight
""")

в базе данных с большим количеством статей и ссылок запрос занимает много времени и использует всю память моей системы, предположительно потому, что он копирует весь набор результатов в память за один раз. Есть ли какая-то версия на основе курсора, в которой я мог бы перебирать результаты по одному, не имея их всех в памяти одновременно?

ИЗМЕНИТЬ

Я нашел функцию stream:

stuff = graph.cypher.stream("""
    match (a:Article)-[p]-n return a, n, p.weight
""")

это похоже на то, что я хочу в соответствии с документацией, но теперь я получаю ошибку тайм-аута (py2neo.packages.httpstream.http.SocketError: timed out), после чего сервер перестает отвечать на запросы, пока я не убью его с помощью kill -9.


person Andrew Magee    schedule 17.02.2015    source источник


Ответы (1)


Вы пытались реализовать механизм пейджинга? Возможно, с ключевым словом skip: http://neo4j.com/docs/stable/query-skip.html

Аналогично использованию limit/offset в запросе postgres/mysql.

РЕДАКТИРОВАТЬ: ранее я говорил, что весь набор результатов хранится в памяти, но, похоже, это не так при использовании потоковой передачи API - согласно комментарию Найджела (неоинженер) ниже.

person Paul Shoemaker    schedule 17.02.2015
comment
Да, я думал об этом, но надеюсь, что не придется; кажется громоздким способом реализовать что-то настолько простое. - person Andrew Magee; 18.02.2015
comment
Потоковый метод не помещает весь результат в память — он постепенно анализирует возвращаемый JSON. - person Nigel Small; 18.02.2015
comment
@NigelSmall - вы говорите, что набор результатов не хранится в памяти на компьютере с базой данных графа? Мои извинения за непонимание того, как это работает... - person Paul Shoemaker; 19.02.2015
comment
При использовании метода stream результаты передаются с сервера в потоковом режиме по мере их вычисления (neo4j.com/docs/stable/rest-api-streaming.html) и передаются из ответа клиента по мере его получения в вызывающее приложение (github.com/nigelsmall/jsonstream). - person Nigel Small; 19.02.2015
comment
@NigelSmall - злой! Спасибо за разъяснения. Я отредактирую свой комментарий, чтобы отразить правду. - person Paul Shoemaker; 19.02.2015