【问题标题】:Neo4J / py2neo -- cursor-based query?Neo4J / py2neo——基于游标的查询?
【发布时间】:2015-02-17 10:06:39
【问题描述】:

如果我这样做:

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 杀死它。

【问题讨论】:

    标签: python neo4j py2neo


    【解决方案1】:

    您是否尝试过实现分页机制?或许使用 skip 关键字:http://neo4j.com/docs/stable/query-skip.html

    类似于在 postgres / mysql 查询中使用限制 / 偏移量。

    编辑:我之前说过整个结果集都存储在内存中,但在使用 api 流时似乎并非如此 - 根据下面 Nigel(Neo 工程师)的评论。

    【讨论】:

    • 是的,我确实想过,但我希望不必这样做;实现如此简单的事情似乎是一种笨拙的方式。
    • stream 方法不会将整个结果放在内存中 - 它会逐步解析返回的 JSON。
    • @NigelSmall - 你是说结果集没有保存在图形数据库机器的内存中吗?我很抱歉误解了它的工作原理......
    • 当使用stream 方法时,结果在计算时从服务器流式传输 (neo4j.com/docs/stable/rest-api-streaming.html),并从客户端上的响应流式传输到调用应用程序 ( github.com/nigelsmall/jsonstream).
    • @NigelSmall - 邪恶!感谢您的澄清。我将编辑我的评论以反映真相。
    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2020-05-18
    • 2022-06-12
    相关资源
    最近更新 更多