【问题标题】:Union step does not work with multiple elements联合步骤不适用于多个元素
【发布时间】:2020-04-12 05:08:03
【问题描述】:

以下查询返回一个用户映射,其中包含一个名为“questions”的“注入”属性,它在 g.V().has() 返回单个用户时按预期工作,但在返回多个用户时不会:

  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));

它有效,但是当我更改第一行以返回多个用户时:

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

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

【问题讨论】:

    标签: azure-cosmosdb gremlin tinkerpop tinkerpop3 gremlin-server


    【解决方案1】:

    在使用 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() 并按照每个初始“用户”顶点遍历器执行一次操作。你可以通过map() 告诉 Gremlin 这样做:

    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)
           )
    

    【讨论】:

    • .group().by(__.select(column.keys)).by(__.select(column.values)) 返回我需要的,一个地图列表,.group().by(column.keys).by(column.values) 返回一个地图,其中所有属性作为数组包含所有用户的所有值,而不是我需要的,所以不是相同。其他您的解决方案完美无缺,再次感谢!!! Gremlin 令人困惑,因为似乎 map() 有时需要有时不需要,具体取决于您调用的步骤类型。
    • 哦 - 对不起 - 我没有发现你想要的那种微妙之处。我倾向于觉得对 Gremlin 的困惑与对流的困惑有关,这就是为什么我以我的方式写这个答案的原因。我希望这有助于澄清你的想法。对 map() 的需求并不是完全任意的——有理由使用它,也有理由不使用它,这些原因与语言的面向流的性质有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2021-12-13
    • 1970-01-01
    • 2013-01-30
    相关资源
    最近更新 更多