我在这里使用cypher语句创建了一个Neo4j数据库:https://gist.github.com/neoecos/8748091
我想知道:如何获得: 1.无转移路径(按转移顺序) 2.最短路径(按路径长度排序) 3.最佳路径(较少传输和最短路径)
请给出相应的查询。 您认为这是创建总线查询系统的最佳方式吗? 非常感谢。
答案 0 :(得分:6)
最短路径非常简单:
MATCH path=shortestPath((station_44:STATION {id:44})-[*0..10]-(station_46:STATION {id:46}))
RETURN path
就计数转移而言,您可以执行以下操作:
MATCH path=allShortestPaths((station_44:STATION {id:44})-[rels*0..10]-(station_46:STATION {id:46}))
RETURN length(path) AS stop_count, length(FILTER(index IN RANGE(1, length(rels)-1) WHERE (rels[index]).bus <> (rels[index - 1]).bus)) AS transfer_count
一旦你有了这两个变量,你就可以计算/排序。例如:
MATCH path=(station_44:STATION {id:44})-[rels*0..4]-(station_46:STATION {id:46})
WITH length(path) AS stop_count, length(FILTER(index IN RANGE(1, length(rels)-1) WHERE (rels[index]).bus <> (rels[index - 1]).bus)) AS transfer_count
RETURN stop_count, transfer_count
ORDER BY (stop_count * 0.5) + (transfer_count * 2.0) DESC
在这里,我删除了allShortestPaths
调用,以便获得不同长度的路径。 ORDER BY
使用两个指标的权重。不幸的是,至少在我的数据库中,如果超过四个路径长度,它开始变得非常慢。如果在您的情况下有意义的话,您可以通过在路径中引入方向箭头来改进它。