如何在 Gremlin 遍历中使用 sideEffect 和 dedup?

How to use sideEffect and dedup in a Gremlin traversal?

背景

我们正在尝试建立一个查询,以便对于给定的 label 我们想要获得该 label 类型的 all 邻居获取 ID 列表。我们有大约 5 个不同的标签,因此我们正在构建遍历以在单个查询中完成所有操作。

目标

我们要确保对于给定的 label,我们查询 N 个邻居,并且对于 idsToBatchQuery 列表中的所有聚合邻居,我们将它们全部删除。

我们面临的问题是副作用只是对每个顶点进行重复数据删除。 例如 - 如果我们在 idsToBatchQuery 列表中有 10 个顶点并且每个顶点有 3 个邻居,我们只对这 3 个邻居进行重复数据删除,而不是对 30 个完整的邻居列表进行重复数据删除。

问题

我们如何修改以下查询以从 idsToBatchQuery 中的所有顶点中获取前 maxBreadth 个唯一邻居?

        var traversal = g.V(idsToBatchQuery.toArray())

        for (String label : labels) {
          traversal =
              traversal.sideEffect(
                  outE(EDGE_LABEL)
                      .inV()
                      .hasLabel(label)
                      .dedup()
                      .by(T.id)
                      .limit(maxBreadth)
                      .aggregate(label));
        }

使用air-routes数据集,这里是一个类似的查询,但是dedup这一步被where(without('labels'))代替了。这提供了对所有值的更全局重复数据删除,而不仅仅是两个“本地”值。

g.V('1','2','3','56').
  sideEffect(
    outE('route').
    inV().
    hasLabel('airport').
    where(without('labels')).
    limit(2).
    aggregate('labels')).
  sideEffect(
    inE('contains').
    outV().
    hasLabel('country').
    where(without('labels')).
    limit(2).
    aggregate('labels')).
  cap('labels').
  unfold().
  values('desc')

这是 运行 查询的输出。如果像在您的原始查询中那样使用 dedup,结果会重复。

1   Ontario International Airport
2   Greater Rochester International Airport
3   United States
4   Fairbanks International Airport
5   Reykjavik, Keflavik International Airport
6   Charlotte Douglas International Airport
7   Cancun International Airport
8   Phnom Penh International Airport
9   Gold Coast Airport
10  Singapore

如果使用原来的dedup,可以看到结果有重复

1   Ontario International Airport
2   Ontario International Airport
3   Greater Rochester International Airport
4   United States
5   United States
6   United States
7   Fairbanks International Airport
8   Reykjavik, Keflavik International Airport
9   Charlotte Douglas International Airport
10  Phnom Penh International Airport