我有neo4j的问题。 我不知道问题是我的查询还是别的。
简介
我必须构建一个存储公交/火车路线的应用程序。 这是我的架构:
节点:
重要关系:
NEXT关系包含以下属性:
问题
我的查询是:
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"解决了。但我想我会重新命名所有的关系(就像迈克尔·亨格所说)。
答案 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将使用快速双向广度优先搜索算法。
答案 1 :(得分:2)
您可以分享您的个人资料。
我认为你对 return 1;
我会使用最短路径或dijkstra而不是可选匹配。 OPTIONAL MATCH将尝试找到所有这些数以亿计的路径,并在它们运行时过滤它们。
根据星期几对:Stop(id)
关系进行分组可能是有意义的.e.g NEXT
因此您只需查看1/7的数据。
答案 2 :(得分:1)
这不是设置;事实上,您的查询必须访问图中的每个节点才能满足查询。
当必须使用TABLE SCAN而不是索引时,问题会在关系数据库中显示出来。
我认为解决方案是在数小时内添加存储桶,就像您已经存在数天一样。如果你需要分钟,可以用96个十五分钟的水桶来覆盖一天。这将为查询优化器提供最佳机会。