我有40个站,由ID识别,然后我在这个站之间有大约30k的关系,realation有时间属性(到达出发时间和行的名称)。 我需要找到A站和B站之间的路线,但需要具体的时间范围。 例如:
站A和C之间的不是直接路由,必须使用 A - > B - > C =表示id:1 - > 2 - > 3
我正在使用此查询:
MATCH p=(s1:L2Station{id:1})-[r:RIDE*]->(s2:L2Station{id:3}) WHERE ALL(x in r where x.deptime>=1438605300 AND x.deptime<=1438691700)
WITH reduce(acc = [], route in rels(p)|
CASE
WHEN toInt(route.arrtime) < last(extract(b in acc| b.deptime)) THEN null
WHEN length(acc) > 0 AND last(extract(a in acc| a.rid)) = route.rid THEN acc + route
ELSE acc + route
END) as reducedRoutes
WHERE reducedRoutes is not null
return reducedRoutes, length(reducedRoutes) as len
order by len;
但这个查询花了大约8分钟:(
如果我使用此查询:
MATCH p=(s1:L2Station{id:1})-[r:RIDE]->(s2:L2Station{id:3}) WHERE r.deptime>1438732800 AND r.deptime<1438819200
....
什么都不返回。我只能通过直接路线到达车站。
有人能帮助我吗?
由于
Ondra
答案 0 :(得分:0)
您可能会看到尝试与无限制路径长度匹配的影响:[r:RIDE*]
。逻辑上,这迫使neo4j跟随从站1开始的每个可能路径,看看哪一个在站2结束。可能只有少数尝试路径最终会匹配,但neo4j被迫跟随通往痛苦结局的每一条路。
如果可能,您应该尝试在路径长度上设置上限。例如,要匹配长度为3的路径:[r:RIDE*..3]
。