【问题标题】:Gremlin NodeJS query returns different results than GroovyGremlin NodeJS 查询返回的结果与 Groovy 不同
【发布时间】:2020-11-21 00:13:36
【问题描述】:

我有一个最初在控制台中编写的查询:

    g.V().hasLabel('group')
      .has('type', 'PowerUsers')
      .local(__.union(
         __.project('group').by(__.valueMap().by(__.unfold())),
         __.inE().outV().project('user').by(__.valueMap().by(__.unfold())))
      .fold()).unfold().toList()

我得到类似的东西:

==>{group={owner=A, group_id=21651399-91fd-4da4-8608-1bd30447e773, name=Group 8, type=PowerUsers}}
==>{user={name=John, user_id=91f5e306-77f1-4aa1-b9d0-23136f57142d}}
==>{user={name=Jane, user_id=7f133d0d-47f3-479d-b6e7-5191bea52459}}
==>{group={owner=A, group_id=ef8c81f7-7066-49b2-9a03-bad731676a8c, name=Group B, type=PowerUsers}}
==>{user={name=Max, user_id=acf6abb8-08b3-4fc6-a4cb-f34ff523d628}}
==>{group={owner=A, group_id=07dff798-d6db-4765-8d74-0c7be66bec05, name=Group C, type=PowerUsers}}
==>{user={name=John, user_id=91f5e306-77f1-4aa1-b9d0-23136f57142d}}
==>{user={name=Max, user_id=acf6abb8-08b3-4fc6-a4cb-f34ff523d628}}

当我使用 NodeJS 运行该查询时,我希望得到类似的结果,但我没有。我得到这样的东西:

[ { group:
     { owner: 'A',
       group_id: '21651399-91fd-4da4-8608-1bd30447e773',
       name: 'Group 8',
       type: 'PowerUsers' } },
  { user:
     { name: 'John',
       user_id: '91f5e306-77f1-4aa1-b9d0-23136f57142d'} },
  { user:
     { name: 'John',
       user_id: '91f5e306-77f1-4aa1-b9d0-23136f57142d'} },
  { user:
     { name: 'Jane',
       user_id: '7f133d0d-47f3-479d-b6e7-5191bea52459'} },
  { user:
     { name: 'Jane',
       user_id: '7f133d0d-47f3-479d-b6e7-5191bea52459'} },
  { group:
     { owner: 'A',
       group_id: 'ef8c81f7-7066-49b2-9a03-bad731676a8c',
       name: 'Group B',
       type: 'PowerUsers' } },
  { user:
     { name: 'Max',
       user_id: 'acf6abb8-08b3-4fc6-a4cb-f34ff523d628' } },
  ...

因为我在不同的组中有相同的用户,所以我不能使用 dedup(),如果 NodeJS 中的结果与 Groovy 相同,那就完美了。不幸的是,它们不是,我不明白为什么 NodeJS 中的结果都是一团糟,考虑到查询完全一样

【问题讨论】:

  • 我认为您需要澄清这两个结果的不同之处。我看到 js 结果中缺少“Jane”,并且“John”被重复了几次,但我不确定我是否遵循了为什么你的控制台结果是“正确的”而 js 的结果是“错误的” .也许您应该包含一些示例数据作为演示预期输出的 gremlin 脚本。至于为什么结果完全不同,因为它们是相同的遍历可能只是与遍历器的非确定性排序有关。
  • 我犯了一个错误,Jane x2 应该代替 john。我假设相同的查询应该在控制台和通过 Node.js 显示相同的结果。也许有一些特定的设置在 NodeJS 上有一些默认值,而控制台上没有设置?
  • 如果你想要一个特定的顺序,你应该明确地使用 Gremlin 并使用order() 步骤来控制它。否则,您可能会得到不确定的结果(取决于后端)。因此,我无法真正说出您在这里真正想要什么,这就是为什么我要求提供更多背景信息。仅凭我的直觉,我认为结果的不同结构会更好,其中用户直接绑定到他们的组而不是依赖遍历顺序,但我不知道您的要求。
  • 是的,这就是我的意思(解释得不好)。我需要的是组,然后是用户,如果有的话,就在它下面,这样我就可以知道哪些用户属于哪个组。根据我得到的结果,我无法知道 John 和 Jane 所在的组。控制台的结果正是我所需要的。现在我必须弄清楚如何订购它们,以便获得相同的列表。

标签: node.js gremlin amazon-neptune


【解决方案1】:

我觉得您可以使用嵌套的project() 来让您的群组与您的用户保持联系:

g.V().hasLabel('group')
     .has('type', 'PowerUsers')
     .project('group', 'users')
        .by(__.valueMap().by(__.unfold()))
        .by(__.in().project('user').by(__.valueMap().by(__.unfold()).fold()))

通过这种方式,您不必担心订购任何东西。我认为使用“组”作为Map 中的键,其值是用户列表,可能更像 Gremlin 风格:

g.V().hasLabel('group')
     .has('type', 'PowerUsers')
     .group()
        .by(__.valueMap().by(__.unfold()))
        .by(__.in().project('user').by(__.valueMap().by(__.unfold()).fold()))

【讨论】:

  • 我都试过了,但海王星似乎都不喜欢。我现在最终做了多个查询,直到我有时间处理这个问题。谢谢,很有帮助。
  • 丢失的问题),我不确定他们去了哪里。在这种情况下: g.V().hasLabel('group').has('type', 'PowerUsers').group().by(.valueMap().by(.unfold() ).by(.in().project('user').by(.valueMap().by(__.unfold()).fold()))) 将给出:{" detailMessage":"java.util.ArrayList 不能转换为 org.apache.tinkerpop.gremlin.structure.Vertex","re​​questId":"a341a55c-e76a-4652-91bc-726f68fa5ae4","code":"UnsupportedOperationException"}
  • 对于这个:g.V().hasLabel('group').has('type', 'PowerUsers').project('group', 'users').by( .valueMap().by(.unfold())).by(.in().project('user').by(.valueMap().by(__.展开()).fold()))(修复括号问题后):{“detailedMessage”:“提供的遍历器未映射到值:v[20baeed1-7fc0-cb4e-f3ff-bd5f39e2da45]->[ VertexStep(IN,vertex), ProjectStep([user],[[PropertyMapStep([[UnfoldStep]],value), NeptuneMemoryTrackerStep, FoldStep]])]","re​​questId":"e0837f03-e2b2-42eb-9a74-925a9a21d9c8" ,"code":"InvalidParameterException"}
  • 我修复了语法错误,但我感觉还是有问题。这就是为什么最好以 Gremlin 脚本的形式提供一些示例数据以及您的问题,因为这样您就可以得到经过全面测试的遍历。这是一个例子stackoverflow.com/questions/51388315/…
  • 请注意,使用gremlify.com 之类的工具总是很容易找到语法错​​误——“格式”按钮有助于指出问题。
猜你喜欢
  • 2011-11-08
  • 1970-01-01
  • 2017-10-05
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 2022-06-11
  • 1970-01-01
相关资源
最近更新 更多