【问题标题】:Gremlin search for vertexes related to 2 or more specific nodesGremlin 搜索与 2 个或更多特定节点相关的顶点
【发布时间】:2019-01-28 09:34:26
【问题描述】:

我正在尝试生成一个 Gremlin 查询,据此我需要找到具有来自特定其他顶点的边的顶点。此查询的不太抽象的版本是我有用户顶点,这些顶点与组顶点相关(即学校中的科目,所以“6 年级数学”和“6 年级英语”等的学生)。一个额外的困难是子组在这个查询中存在的能力。

查询我需要找到那些在用户指定的2个或更多组中的用户。

目前我有一个简短的解决方案,但在使用 Amazon Netpune 的生产使用中,即使使用少量数据,此查询的性能也很差。我确信有一种更简单的方法可以实现这一点:/

g.V()
.has('id', 'group_1')
.repeat(out("STUDENT", "SUBGROUP"))
.until(hasLabel("USER"))
.aggregate("q-1")
.V()
.has('id', 'group_2')
.repeat(out("STUDENT", "SUBGROUP"))
.until(hasLabel("USER"))
.where(within("q-1"))
.aggregate("q-2")
.V()
.hasLabel(USER)
.where(within("q-2"))
# We add some more filtering here, such as search terms
.dedup()
.range(0, 10)
.values("id")
.toList()

【问题讨论】:

    标签: graph gremlin amazon-neptune


    【解决方案1】:

    您可以做的第一个主要更改是不再为“USER”重复所有V() - 这已经是前面步骤的输出,因此收集“q-2”只是为了将其用于过滤器不会'似乎没有必要:

    g.V().
      has('id', 'group_1').
      repeat(out("STUDENT", "SUBGROUP")).
        until(hasLabel("USER")).
      aggregate("q-1").
      V().
      has('id', 'group_2').
      repeat(out("STUDENT", "SUBGROUP")).
        until(hasLabel("USER")).
      where(within("q-1")).
      # We add some more filtering here, such as search terms
      dedup().
      range(0, 10).
      values("id")
    

    这应该已经为您的查询节省了大量资金,因为该更改避免了在内存中迭代整个图形(即完全扫描所有顶点),因为那里没有索引查找。

    我不知道您的附加过滤器在这里:

    # We add some more filtering here, such as search terms 
    

    但我肯定会尝试在您的查询中更早地过滤用户,而不是稍后。也许考虑在您的repeats() 上使用emit() 以更好地过滤。您可能还应该dedup()您的“q-1”并减少那里的列表大小。

    我很想知道我建议的初始更改有多少有效,因为这可能是您查询成本的最大部分(除非您有一个非常深/宽的学生/子组树我猜)。也许这里还有更多可以调整的地方,但很高兴知道您至少在这一点上有一个令人满意的遍历性能。

    【讨论】:

    • 我们遇到的困难之一是我们应用的额外过滤器之一是检查用户是否属于我们提供的另一个组列表中的任何一个:/
    • 好的...聚合“q-2”以便您可以进行额外检查,但应用其他更改以摆脱完整扫描并让我知道您所看到的术语的性能改进。之后,如果您以 Gremlin 脚本的形式提供一些示例数据以及您正在寻找的所有必需过滤器的确切输出,这可能会有所帮助,以便可以提供经过全面测试的遍历作为查看您的答案的答案整体的问题。这是一个有用的脚本类型示例:stackoverflow.com/questions/51388315/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2023-01-28
    相关资源
    最近更新 更多