我用neo4j创建了一个Bus Route数据库,你可以在这里下载https://www.dropbox.com/s/zamkyh2aaw3voe6/data.rar?dl=0
我希望获得更少的传输路径,我想这样做:
MATCH path=allShortestPaths((start:潍坊_STATION {name:'寒亭一村'})-[rels*..50]->(end:潍坊_STATION {name:'火车站'}))
RETURN NODES(path) AS stations,relationships(path) AS path,
length(FILTER(index IN RANGE(1, length(rels)-1) WHERE (rels[index]).bus <> (rels[index - 1]).bus)) AS transfer_count
ORDER BY transfer_count
LIMIT 10
但结果不正确,谁可以帮助我?
答案 0 :(得分:0)
这会给你你想要的东西吗?
MATCH path=allShortestPaths((start:潍坊_STATION {name:'寒亭一村'})-[rels*..50]->(end:潍坊_STATION {name:'火车站'}))
RETURN NODES(path) AS stations,relationships(path) AS route,
length(path) AS transfer_count
ORDER BY transfer_count ASC
LIMIT 10
这应该返回连接按路径长度排序的两个站的10条路径。虽然,这里的订购并不需要。由于我们使用的是allShortestPaths
函数,因此找到的所有路径长度都相同(就您共享的数据而言,22)。
您在提问中提到了转移时间,但我没有将时间视为您数据中的属性。如果你有时间存储,你可以使用reduce
函数来计算旅行时间和顺序。
修改强>
使用extract
函数从路径中的关系中收集总线名称:
MATCH
path=allShortestPaths((start:潍坊_STATION {name:'寒亭一村'})-[rels*..50]->(end:潍坊_STATION {name:'火车站'}))
RETURN
NODES(path) AS stations, relationships(path) AS route,
length(path) AS transfer_count, extract(x in rels | x.bus) AS buses
ORDER BY transfer_count ASC
LIMIT 10