我有40个站,用ID标识,那么我这个站之间有大约30k的关系,关系有时间属性(到达发车时间和线路名称)。我需要找到A站和B站之间的路线,但要有具体的时间范围。例如:
站A和站C之间不是直达路线,必须使用A -> B -> C= means 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
发布于 2015-07-28 03:29:51
您可能正在看到尝试匹配一个无界路径长度的影响:[r:RIDE*]。从逻辑上讲,这会迫使neo4j遵循从站点1开始的每条可能的路径,看看哪条路径在站点2结束。可能只有几条尝试的路径最终会匹配,但neo4j被迫沿着每条路径一直走到痛苦的尽头。
如果可能,您应该尝试设置路径长度的上限。例如,要匹配最大长度为3的路径:[r:RIDE*..3]。
https://stackoverflow.com/questions/31642564
复制相似问题