【问题标题】:How to use sideEffect and dedup in a Gremlin traversal?如何在 Gremlin 遍历中使用副作用和去重?
【发布时间】:2021-10-15 01:19:00
【问题描述】:

背景

我们正在尝试构建一个查询,以便对于给定的label,我们希望获取该label 类型的所有邻居的所有 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));
        }

【问题讨论】:

  • 也许用where(without(label))替换dedup
  • 我在下面添加了一个答案,显示了这种模式。

标签: gremlin amazon-neptune


【解决方案1】:

使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多