NEO4J按时间查找连续路线

时间:2015-07-26 22:26:04

标签: neo4j routes

我有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

1 个答案:

答案 0 :(得分:0)

您可能会看到尝试与无限制路径长度匹配的影响:[r:RIDE*]。逻辑上,这迫使neo4j跟随从站1开始的每个可能路径,看看哪一个在站2结束。可能只有少数尝试路径最终会匹配,但neo4j被迫跟随通往痛苦结局的每一条路。

如果可能,您应该尝试在路径长度上设置上限。例如,要匹配长度为3的路径:[r:RIDE*..3]