【问题标题】:Neo4j out of memory ErrorNeo4j 内存不足错误
【发布时间】:2015-03-07 18:56:56
【问题描述】:

我已经根据Nicole Whitethis link 中的这个答案为我的neo4j 数据库建模

我也成功测试了密码查询

MATCH (a:Stop {name:'A'}), (d:Stop {name:'D'})
MATCH route = allShortestPaths((a)-[:STOPS_AT*]-(d)),
stops = (a)-[:NEXT*]->(d)
RETURN EXTRACT(x IN NODES(route) | CASE WHEN x:Stop THEN 'Stop ' + x.name
                                    WHEN x:Bus THEN 'Bus ' + x.id
                               ELSE '' END) AS itinerary,
   REDUCE(d = 0, x IN RELATIONSHIPS(stops) | d + x.distance) AS distance

针对一个有 10 个节点的小型测试图。

但我的原始图表包含大约 2k 个节点和 6k 个关系,导致查询出现问题。查询停止了,我得到一个错误:

java.lang.OutOfMemoryError: Java 堆空间

您能帮我优化查询或任何其他解决方案吗?

谢谢

【问题讨论】:

  • 我想更多信息会很有用,比如你的架构索引、neo4j 配置(尤其是堆设置)和执行计划的输出。
  • 这里的这一位:stops = (a)-[:NEXT*]->(d) 似乎枚举了通过您的数据的大量路径,考虑到它不是特定于任何公交路线,而只是询问可以从哪些其他车站到达哪些车站.如果你有一个高度互联的公交路线系统,那将是很多东西。一些路径可能是直接的,其他路径可能会穿过您的大部分系统(通过连接点)。
  • 是的,这似乎是问题所在。那么我有什么选择?我是 cypher 新手,非常感谢一些指导。

标签: neo4j query-optimization cypher graph-databases


【解决方案1】:

尝试引入WITH 以将:NEXT 路径的计算限制为仅已知为最短路径的那对a、d。为可变路径长度匹配提供上限也是一个好习惯 - 我在这里使用 100 作为示例:

MATCH route = allShortestPaths(
   (a:Stop {name:'A'})-[:STOPS_AT*100]-(d:Stop {name:'D'})
)
WITH route, a, d
MATCH stops = (a)-[:NEXT*100]->(d)
RETURN EXTRACT(x IN NODES(route) | CASE WHEN x:Stop THEN 'Stop ' + x.name
                                WHEN x:Bus THEN 'Bus ' + x.id
                           ELSE '' END) AS itinerary,
REDUCE(d = 0, x IN RELATIONSHIPS(stops) | d + x.distance) AS distance

【讨论】:

  • 感谢这个好主意,但由于某种原因,它没有给我任何结果。它返回 0 个节点。
猜你喜欢
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
相关资源
最近更新 更多