【问题标题】:neo4j finding all paths that meets a certain criterianeo4j 找到满足特定条件的所有路径
【发布时间】:2013-09-20 17:59:57
【问题描述】:

我正在尝试对图形进行建模以解决一些连接时间问题。所以例如我有下面的图表

    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 来解决这个问题,但没有成功。 (可能是我建模错了)。

【问题讨论】:

  • 你能详细解释一下你的域名吗?没有人会知道 ST、F1 等在这里意味着什么。接下来,在 console.neo4j.org 中设置您的测试数据并在此处“分享”链接(点击右上角的分享按钮)
  • 这里是控制台console.neo4j.org/r/vxdbod的链接,域由站(ST_B,ST2,ST?等)和航班(F1-F9)组成,Flight连接站。我想找到 ST_B 和 ST_E 的所有有效路线。
  • 这里是连接链接console.neo4j.org/?id=l7nji7
  • 为什么连接对F2无效?
  • F2到达时间比F3出发时间(10:30am)多1100(11:00am),F6和F7相同。

标签: neo4j cypher


【解决方案1】:

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

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”子句返回构成有效航线的航班名称。

【讨论】:

  • 哇,现在我看到了 cypher 的力量。我有一个更复杂的问题,我将尝试对此进行扩展。如果我自己无法解决,将发布它。
  • @Lisa +1。你能解释一下为什么用 2 而不是 1 减去长度(flts)吗?
  • @Pangea。一个集合的索引范围是 0 到 length-1,因为我使用 'i' 和 'i+1' 作为索引来访问两个连续的航班,并保持索引在 0~(length-1) 的范围内,必须满足 (i+1)
  • 我已经添加了使用某些飞机的航班(有些有 wifi,有些没有),如果我需要进一步过滤,只看到有 wifi 的有效路线,密码查询是什么.让我知道模型是否错误。这是扩展样本数据的链接console.neo4j.org/r/sdcixy。正确的返回应该只有 F5-F7-F8 和 F9,因为 F1 使用没有 wifi 的 AC1,路线 F1-F3-F4 消失了。
  • 这是我发现很难用 Cypher 完成的案例之一。它归结为选择路径的问题,其节点需要进一步匹配另一个模式(flt-[:Use]->ac:Aircraft),并且该模式需要一个新的标识符“ac”来指定对属性的约束,例如作为“ac.wifi=1”。由于不能在“Where”表达式中引入新标识符的限制,这对于 Cypher 是不可行的。
猜你喜欢
  • 2012-01-22
  • 2013-03-05
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多