Neo4j - Java堆空间。错误的查询或设置?

时间:2017-04-02 12:12:13

标签: java docker database-design neo4j cypher

我有neo4j的问题。 我不知道问题是我的查询还是别的。

简介

我必须构建一个存储公交/火车路线的应用程序。 这是我的架构:

节点

  • Organizaton :有路线/公共汽车等的公司..
  • 路线:巴士路线,如:巴黎 - 柏林。
  • 车辆(本例中为公交车):带有独特车牌的Fisical巴士。
  • 停止:指向具有纬度和经度的地图。

重要关系

  • NEXT :这是一个非常重要的关系。

NEXT关系包含以下属性:

  • startHour
  • startMinutes
  • endHour
  • endMinutes
  • dayOfWeek(从0到6 - 太阳,周一等......)
  • vehicleId

enter image description here

问题

我的查询是:

MATCH (s1:Stop {id: {departureStopId}}), (s2:Stop {id: {arrivalStopId}})
OPTIONAL MATCH (s1)-[nexts:NEXT*]->(s2)
WHERE ALL(i in nexts WHERE toInt(i.dayOfWeek) = {dayOfWeek} AND toInt(i.startHour) >= {hour})
RETURN nexts
LIMIT 10

例如:我想找到所有nexts关系,其中dayOfWeek是星期日(0)和属性startHour> 11

之后我通常在我的nodejs后端解析并验证最终对象。

这在我开始时起作用..与1k关系.. 现在我有10k的关系,我的查询有一个TIMEOUT问题或查询在30s解决..太多时间...... 我不知道如何解决这个问题。 我使用neo4j和docker,我试着阅读设置文档,但我不知道Java是如何工作的。

你能帮帮我们吗?

更新

谢谢大家! 现在我用" allShortestPaths"解决了。但我想我会重新命名所有的关系(就像迈克尔·亨格所说)。

3 个答案:

答案 0 :(得分:4)

你试过了吗?

MATCH p=allShortestPaths((s1:Stop {id: {departureStopId}})-[:NEXT*]-> (s2:Stop {id: {arrivalStopId}}) )
WHERE ALL(i in RELS(p) WHERE toInt(i.dayOfWeek) = {dayOfWeek} AND toInt(i.startHour) >= {hour})
RETURN rels(p) as nexts
LIMIT 10

这应该使用快速最短路径算法,因为:

  

根据需要评估的谓词,规划Cypher中的最短路径可能会导致不同的查询计划。在内部,如果可以在搜索路径时评估谓词,Neo4j将使用快速双向广度优先搜索算法。

有关详细信息,请参阅https://neo4j.com/docs/developer-manual/current/cypher/execution-plans/shortestpath-planning/#_shortest_path_with_fast_algorithm

答案 1 :(得分:2)

您可以分享您的个人资料。

我认为你对 return 1;

有约束

我会使用最短路径或dijkstra而不是可选匹配。 OPTIONAL MATCH将尝试找到所有这些数以亿计的路径,并在它们运行时过滤它们。

根据星期几对:Stop(id)关系进行分组可能是有意义的.e.g NEXT因此您只需查看1/7的数据。

答案 2 :(得分:1)

这不是设置;事实上,您的查询必须访问图中的每个节点才能满足查询。

当必须使用TABLE SCAN而不是索引时,问题会在关系数据库中显示出来。

我认为解决方案是在数小时内添加存储桶,就像您已经存在数天一样。如果你需要分钟,可以用96个十五分钟的水桶来覆盖一天。这将为查询优化器提供最佳机会。