如何在 Gremlin 中短路 where 语句?

How to short-circuit a where statement in Gremlin?

我想知道是否可以在找到第一个结果时短路 where 语句。

这是一个示例查询:

g.V().hasLabel('SEAT')
    where(
        __.repeat(out('NEXT').simplePath())
        .until(loops().is(gte(2)))
    )
    .in('CONTAINS')
    .dedup()

重复数据删除是必需的,因为给定顶点可能有多个长度,这些顶点在 'CONTAINS' 的入边上有父节点,在 'NEXT' 的出边上有顶点链.

我想要的是在找到第一次满足条件的顶点时短路 where。

这是一个示例图和查询:https://gremlify.com/bwa7spaz97b/5

关于此问题的更多说明:

如果我将查询更改为使用 path 而不是 dedup,结果如下:

[
  [
    {
      "id": 15245,
      "label": "SEAT"
    },
    {
      "id": 15239,
      "label": "SECTION"
    }
  ],
  [
    {
      "id": 15248,
      "label": "SEAT"
    },
    {
      "id": 15239,
      "label": "SECTION"
    }
  ],
  [
    {
      "id": 15257,
      "label": "SEAT"
    },
    {
      "id": 15242,
      "label": "SECTION"
    }
  ],
  [
    {
      "id": 15260,
      "label": "SEAT"
    },
    {
      "id": 15242,
      "label": "SECTION"
    }
  ],
  [
    {
      "id": 15263,
      "label": "SEAT"
    },
    {
      "id": 15242,
      "label": "SECTION"
    }
  ]
]

您可以注意到,对于满足where条件的每条路径(即具有相同SECTION顶点的多个结果),都有一个结果(子顶点开始+父顶点)。我希望查询在找到满足 where 子句的第一条路径后停止处理。

从根本上说,我想找到每个 'SECTION' 顶点,其中在其子顶点上存在长度为 N 或更大的路径。

我正在寻找的结果(使用 path)看起来像这样:

[
  [
    {
      "id": 15245,
      "label": "SEAT"
    },
    {
      "id": 15239,
      "label": "SECTION"
    }
  ]
  [
    {
      "id": 15257,
      "label": "SEAT"
    },
    {
      "id": 15242,
      "label": "SECTION"
    }
  ]
]

我基本上是在寻找类似 whereFirst 的东西(如果它确实存在的话)。

您可以按如下方式重写查询以过滤掉 where

中的重复项
g.V().hasLabel('SEAT').
    where(
        __.repeat(out('NEXT').simplePath().where(without('x')).store('x'))
        .until(loops().is(gte(2)))
    )
    .in('CONTAINS')