我试图产生一个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()
答案 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}并在此减小列表的大小。
我很想知道我建议的初始更改有多大作用,因为这可能是查询成本中最大的一部分(除非您猜想您的学生/子群确实很深/很宽)。也许这里还有更多可以调整的地方,但是很高兴知道您至少在此时具有令人满意的性能遍历。