2017-04-02 55 views
2

我有一个neo4j的问题。 我不知道如果问题是我的查询或其他东西。Neo4j - Java堆空间。错误的查询或设置?


介绍

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

节点

  • Organizaton:公司具有路由/总线等。
  • 路线:巴黎 - 柏林:喜欢巴士路线。
  • 车辆(在这种情况下,公交车):带有独特车牌的Fisical巴士。
  • 停止:指向经纬度的地图。

重要关系

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

下人际关系包含这些属性:

  • startHour
  • startMinutes
  • endHour
  • endMinutes
  • 一周中的某天(从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的关系,我的查询有超时问题或查询在30年代解决了..太多时间...... 我没有想法如何解决这个问题。 我使用docker的neo4j和我试图阅读设置文档,但我不知道Java如何工作。

你能帮助我吗?


UPDATE

谢谢大家家伙! 现在我解决了“allShortestPaths”,但我想我会重新命名所有关系(如Michael Hunger所说的)。

+0

此外,默认泊坞窗图像保留太少的RAM,你必须通过env变量增加HEAP到4G或8G取决于。 –

回答

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

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

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

我认为解决方案是添加桶几个小时,就像你已经有几天。如果你必须有分钟数,可以制作96个十五分钟的水桶来放置一天。这将为查询优化器提供最佳机会。

2

你能分享你的个人资料。

我相信你有:Stop(id)

约束我会用最短路径或使用的Dijkstra成本,而不是可选的比赛。 可选匹配将尝试找到所有这些数以亿计的路径并过滤它们。

按照星期几,例如:NEXT_MO, :NEXT_THU将您的NEXT关系进行分组可能是有意义的,因此您只能查看1/7的数据。