neo4j找到符合特定标准的所有路径

时间:2013-09-20 17:59:58

标签: neo4j cypher

我正在尝试建模图来解决一些连接时间问题。例如,我有以下图表

    F1,F2     F3     F4

ST_B ---------> ST2 -----> ST3 ------> ST_E

   F5,F6      F7       F8

ST_B --------> ST4 ----> ST5 ------> ST_E

    F9

ST_B --------> ST_E

我将ST_B,ST2,ST3,ST4,ST5,ST_E建模为站(节点)。和F1-F9作为flt节点。每个flt节点都有出发时间和到达时间。这种关系是连接的。同样在这种情况下,假设F2到达时间比F3出发时间少30分钟,而F6比F7少30分钟。 (表示连接无效)因此从ST_B到ST_E的有效路由应为F1-F3-F4,F5-F7-F8和F9。我试图使用cypher来解决这个问题但没有成功。 (可能是我造的错了)。

1 个答案:

答案 0 :(得分:4)

我为节点添加了标签,以区分航班和车站。所有航班F1-F9都标有:航班,所有车站ST_B,ST_E和ST_2-ST_5都标有:车站。

Match path=stb:Station-[:Connect*]->ste:Station
Where stb.name='ST_B' and ste.name='ST_E'
With filter(x in nodes(path) where x:Flight ) as flts
Where all ( i in Range(0,length(flts)-2) Where flts[i].arrvTime < flts[i+1].dptrTime)
Return extract(flt in flts | flt.name)
  1. “Match”和“Where”子句检索从ST_B到ST_E的所有路径;
  2. “With”子句检索路径上的所有航班节点,并将它们传递给下一个“Where”子句。
  3. 下一个“Where”条款检查每个航班的到达时间和相连航班的起飞时间,以仅返回有效的航班组合。
  4. 最后的“Return”子句返回形成有效路线的航班名称。