联合步骤不适用于多个元素

Union step does not work with multiple elements

以下查询 return 是一个带有 "injected" 属性 的用户映射,名为 "questions",它在 g.V().has() return 时按预期工作是单个用户,但当 return 是多个用户时则不是:

  return g.V().has("user", "userId", 1)
      .union(
         __.valueMap().by(__.unfold()),
         __.project('questions').by(
            __.outE('response').valueMap().by(__.unfold()).fold()
         )
      )
      .unfold()
      .group()
      .by(__.select(column.keys))
      .by(__.select(column.values));

有效,但是当我将第一行更改为 return 多个用户时:

g.V().hasLabel("user").union(....

我完成了调用 .toList() 的查询,因此我希望以与处理单个用户相同的方式获得所有用户的列表,但我仍然得到一个用户。 如何让我的查询同时适用于多个用户或单个用户?

使用 Gremlin 时,您必须从流的角度考虑。该流包含 traversers,它遍历您编写的步骤。在您的情况下,您的初始测试为:

g.V().has("user", "userId", 1)
      .union(
         __.valueMap().by(__.unfold()),
         __.project('questions').by(
            __.outE('response').valueMap().by(__.unfold()).fold()
         )
      )
      .unfold()
      .group()
      .by(__.select(column.keys))
      .by(__.select(column.values))

你有一个遍历器(即 V().has("user", "userId", 1) 产生一个用户)流向 union() 并被拆分,以便它同时流向 valueMap()project()产生 Map 个实例。您现在有两个遍历器,它们被展开为一个流并组合在一起成为一个最终的 Map 遍历器。

考虑到这一点,当您执行 hasLabel("user") 时会发生什么变化?好吧,你现在有不止一个起始遍历器,这意味着当你到达 union() 时,你将为每个用户生成两个遍历器。它们每个都将被 unfold() 扁平化为流,然后它们将相互覆盖(因为它们具有相同的密钥)以产生一个最终的 Map

你真的想执行你的 union() 并在每个初始 "user" 顶点遍历器上进行一次操作。您可以告诉 Gremlin 使用 map():

g.V().has("user", "userId", 1)
      .map(
        .union(
           __.valueMap().by(__.unfold()),
           __.project('questions').by(
              __.outE('response').valueMap().by(__.unfold()).fold()
         )
        )
        .unfold()
        .group()
          .by(__.select(column.keys))
          .by(__.select(column.values))
       )

最后,您可以将最终的 by() 调制器简化为:

g.V().has("user", "userId", 1)
      .map(
        .union(
           __.valueMap().by(__.unfold()),
           __.project('questions').by(
              __.outE('response').valueMap().by(__.unfold()).fold()
         )
        )
        .unfold()
        .group()
          .by(keys)
          .by(values)
       )