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

我有一个neo4j的问题。 我不知道如果问题是我的查询或其他东西。


介绍

我必须build立一个存储公共汽车/火车路线的应用程序。 这是我的模式:

节点

  • 组织机构 :有路线/公交车的公司等
  • 路线 :巴士路线:巴黎 – 柏林。
  • 车辆(在这种情况下为公交车 :带有独特车牌的Fisical公交车。
  • 停止 :指向经纬度的地图。

重要的关系

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

NEXT关系包含这些属性:

  • startHour
  • startMinutes
  • endHour
  • endMinutes
  • dayOfWeek(从0到6 – Sun,Mon等)
  • vehicleId

在这里输入图像说明


问题

我的查询是:

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 

例如:我想find所有下一个关系dayOfWeek是星期天(0)和属性startHour> 11

之后,我通常parsing并validation我的nodejs后端的最终对象。

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

你能帮助我吗?


UPDATE

谢谢大家! 现在我解决了“allShortestPaths”,但我想我会重新命名所有的关系(如迈克尔·汉格尔说)。

你有没有尝试过:

 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 

这应该使用快速最短pathalgorithm,因为:

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

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

你能分享你的个人资料吗?

我认为你有一个约束:Stop(id)

我会用最短path或dijkstra代替可选的代价。 可选匹配将尝试find所有这样的path,数以百万计,并过滤他们去。

将星期几之间的NEXT关系:NEXT_MO, :NEXT_THU这样你才能看到1/7的数据。

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

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

我认为解决的办法是把桶加几个小时,就像你已经有好几天了。 如果你必须有分钟数,可以用96个十五分钟的桶来盖一天。 这将为查询优化器提供最佳机会。