首页 > 解决方案 > 在 gremlin 中,如何查找和排序给定顶点所属的所有连接顶点的三元组?

问题描述

我正在制作一个用户可以成为朋友的社交应用程序。

对于给定的用户A,我想找到所有的用户三合会这样A -isFriends-> B AND B -isFriends-> C AND C -isFriends-> A

我目前的做法如下:

g.V(A).repeat(__.out('isFriends')).times(3).path().by(id).toList()

然后在 gremlin 之外,我过滤掉所有 Path 对象,其中第一个对象与最后一个对象不同。我宁愿让 gremlin 为我做这个过滤,但我不确定如何根据path().

我试过cyclicPath()了,但这只是返回一个顶点对象的平面列表,我不明白。由此,我希望有类似的输出,path()但只包含第一个和最后一个顶点相同的路径。让我知道这个期望是否不正确。

然后我还想根据子遍历的结果(三个顶点有多少共同朋友)对这些路径进行排序,但我不确定如何从 的输出中包含的顶点开始运行遍历path(),而不开始一个新的 gremlin 查询。

我正在使用 javascript-gremlin 驱动程序 (v3.4.4) 并对 AWS Neptune 进行查询,其中 lambdas 不可用。

如果我的方法或理解不正确,请告诉我。

标签: javascriptgremlinamazon-neptune

解决方案


所以我尝试为您的问题创建一个示例图: 示例图

您正在尝试找到一个简单的循环路径,我认为您可以通过以下方式实现:

g.V().hasLabel('A').as('a')
.both('isFriends').as('b')
.both('isFriends').as('c')
.where(both('isFriends').hasLabel('A'))
.select('a', 'b', 'c')

注意:三元组是对称的,所以它们每个都会返回两次。


推荐阅读