使用cypher,如何在数据库中获得较少的传输路径?

时间:2015-12-04 02:45:31

标签: neo4j cypher

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

但结果不正确,谁可以帮助我?

1 个答案:

答案 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