Gremlin - 同时限制遍历迭代并搜索边 属性

Gremlin - simultaneously limit traverse iterations and search for edge property

我有一段(损坏的)gremlin 代码来生成从给定顶点到具有参数 test_parameter 的顶点的最短路径。如果在边上找不到该参数,则不应 return 编辑任何路径。

s.V(377524408).repeat(bothE().has('date', between(1554076800, 1556668800)).otherV()) /* date filter on edges */
    .until(or(__.bothE().has('test_property', gt(0)),
           loops().is(4)))                                /* broken logic! */
    .path()                                             
    .local(unfold().filter(__.has('entity_id')).fold())   /* remove edges from output paths*/

中断的行是 .until(or(__.outE().has('test_property', gt(0)), loops().is(4)))

目前 - 原因是有道理的 - 它给出了距起始顶点 4 跳的所有路径。

我正在尝试调整它,以便如果遍历是 4 次迭代,并且如果 属性 test_property 而不是 找到,那么它应该没有 return 任何路径。如果找到 test_property,它应该 return 只有到该顶点的路径。

我试图在 times(4) 条件中加入并删除 loops() 条件,但不知道如何同时拥有 times(4).has('test_property', gt(0))约束。

这应该有效:

s.V(377524408).
  repeat(bothE().has('date', between(1554076800, 1556668800)).otherV().as('v')).
    times(4).
  filter(bothE().has('test_property', gt(0))).
  select(all, 'v')

另请注意,我用更简单的东西替换了您的 local(unfold().filter(__.has('entity_id')).fold())(假设唯一目的是从路径中移除边缘)。

Daniel 的回答几乎没有问题(请参阅评论)。 此查询 returns 正确结果:

g.V(377524408)
  .repeat(bothE().has('date', between(1554076800, 1556668800)).otherV().simplePath().as("v"))
  .until(and(bothE().has('tp', gt(0)), loops().is(lte(4))))
  .select(all, "v")
  .limit(1)

simplePath()是必须的,所以我们不会来回绕圈子。

重复循环直到满足条件并且我们还没有达到最大跳数。

limit(1) return 只有第一条(最短)路径。省略获取所有路径。

请注意,如果图形是有向的,最好使用 outE() 而不是 bothE()