Gremlin搜索与2个或更多特定节点相关的顶点

时间:2019-01-28 09:34:26

标签: graph gremlin amazon-neptune

我试图产生一个Gremlin查询,因此我需要查找具有特定其他顶点的边的顶点。此查询的较不抽象的版本是我有用户顶点,并且这些用户顶点与组顶点有关(即,学校中的科目,因此使用“六年级数学”和“六年级英语”的学生等)。另一个困难是该查询中存在子组的能力。

查询中,我需要查找用户指定的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()

1 个答案:

答案 0 :(得分:0)

您可以做的第一个主要更改是不要为“ 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 

但是我肯定会尝试在查询中而不是稍后过滤用户。也许考虑在emit()上使用repeats()进行更好的过滤。您可能还应该dedup() {q-1}并在此减小列表的大小。

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