首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gremlin搜索与2个或更多特定节点相关的顶点

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

Stack Overflow用户
提问于 2019-01-28 17:34:26
回答 1查看 60关注 0票数 0

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

查询我需要查找用户所指定的2个或2个以上组中的用户。

目前我有一个简单的解决方案,但是在使用Amazon Netpune的生产使用中,这个查询的性能太差了,即使只有少量的数据。我相信有一种更简单的方法可以做到这一点:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2019-01-28 23:11:23

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

代码语言:javascript
复制
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")

这应该已经为你的查询节省了一大笔钱,因为这种改变避免了在内存中迭代整个图(即对所有顶点的完全扫描),因为那里没有索引查找。

我不知道你的附加过滤器是什么:

代码语言:javascript
复制
# We add some more filtering here, such as search terms 

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54399008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档