【问题标题】:Neo4j - Reading large amounts of data with JavaNeo4j - 使用 Java 读取大量数据
【发布时间】:2018-07-11 10:40:21
【问题描述】:

我目前正在尝试使用官方 Bolt 驱动程序将大量数据读入我的 Java 应用程序。我遇到了问题,因为图表相当大(~17k 节点,~500k 关系),当然我想分块阅读它以提高内存效率。我想要得到的是源节点和目标节点之间的混合字段,以及关系本身。我试着写一个分页查询:

MATCH (n:NodeLabel)-[r:RelationshipLabel]->(n:NodeLabel) 
WITH r.some_date AS some_date, r.arrival_times AS arrival_times,
     r.departure_times AS departure_times, r.path_ids AS path_ids,
     n.node_id AS origin_node_id, m.node_id AS dest_node_id
ORDER BY id(r)
RETURN some_date, arrival_times, departure_times, path_ids,
       origin_node_id, dest_node_id 
LIMIT 5000

(我更改了一些标签和字段命名,因此查询的用途并不明显)

我的想法是在后续查询中使用SKIP 来读取更多数据。但是,在 5000 行/读取时,每次读取大约需要 7 秒,大概是因为完全扫描 ORDER BY 强制,如果我 SKIP 它会显着增加执行时间和内存使用量。阅读全文太长了,有什么办法可以加快查询速度吗?或者将结果分块流式传输到我的应用程序中?一般来说,读取大量数据的最佳方法是什么?

提前致谢。

【问题讨论】:

    标签: java neo4j cypher bolt


    【解决方案1】:

    而不是skip。从第二次调用中,您可以执行 id(r) > "last received id(r)" 它实际上应该减少处理时间。

    【讨论】:

    • +1!很酷的想法,尝试了它并看到了显着的收益。我认为SKIP 实际上是查询如此缓慢的原因。我现在在大约 11 秒内阅读了整个图表,虽然不完美,但绝对可以接受。非常感谢。
    猜你喜欢
    • 2019-03-16
    • 2012-05-16
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多