Cypher查询到达终端节点

时间:2014-04-27 20:02:26

标签: neo4j cypher

我有一个总线服务的以下数据结构。城市节点有许多到其他城市节点的公交车,这些公交车再次有许多公交车到其他城市节点。

公交车和城市由他们的身份识别。

(适用一个:城市) - [R:为了] - GT;(B:市) - > [R:向] - GT;(C:市) - [R:向] - GT; (d:市)

Node City具有以下属性:cityId(int) relationship to prop:busId(int),arrivalTime(int)。

问题:

给出一个cityId和一个busId如何编写一个密码查询来获取总线的路径,即所有城市从开始到目的地按到达时间排序。

上面提供的cityId确保公共汽车从该城市开始。

我的猜测

匹配(a:城市) - [r:To *] - >(b:City)其中a.cityId = cityid和r.busId = busId返回r,b。按r.arrivalTime排序

1 个答案:

答案 0 :(得分:0)

我认为这会给你你想要的东西(需要Neo4j 2.0.1或更高版本)。

MATCH (c:City)-[legs:TO*]->(terminus)
WHERE c.cityId = { cityId } 
      AND ALL (leg IN legs WHERE leg.busId = { busId })
      AND NOT (terminus)-[:TO {busId: { busId }}]->()
RETURN [leg IN legs | 
        {city: endNode(leg).cityId, arrival: leg.arrivalTime}] 
       AS stops

这里要注意三件事。

  • 处理腿时,由于路径长度可变,我们需要使用收集操作。
  • 如果有一条腿,我们可以使用endnode()函数提取有关它所在城市的信息。
  • 我们使用否定模式来识别路径的终点,否则我们会得到每个可能路径长度的结果。