如何使用Gremlin查询在Neptune数据库中获取多个用户的共同好友
如何使用Gremlin查询在Neptune数据库中获取多个用户的共同好友
我懂你现在的需求——想找出同时是A和B(甚至更多用户)的共同好友,而不是他俩所有好友的合集对吧?你之前写的查询确实会返回A的好友加上B的好友,那咱们来调整下逻辑,实现精准的共同好友筛选。
这里给你两种实用的方案,适配不同的场景:
方案一:分组统计法(适配2个及以上用户)
这种方法扩展性很强,不管是2个还是N个用户都能轻松应对,核心思路是统计每个好友被多少目标用户关联,筛选出关联次数等于目标用户数量的好友:
g.V().has('users','id', within('A', 'B')).out('friend_with') .groupCount().by('id') .unfold() .where(select(values).is(eq(2))) .select(keys)
逻辑拆解:
- 先定位到id为A和B的用户节点
- 遍历他们的
friend_with关联,拿到所有好友节点 - 按好友的
id分组统计出现次数(比如同时是A和B好友的人,次数会是2) - 展开统计结果,筛选出次数等于2的条目
- 最后提取对应的好友id
如果是3个用户的共同好友,只需要把eq(2)改成eq(3)就行,非常灵活。
方案二:交集法(适合2个用户场景)
如果只是找两个用户的共同好友,用交集的逻辑会更直观,直接取两个用户好友集合的交集:
g.V().has('users','id','A').out('friend_with').id().intersect( __.V().has('users','id','B').out('friend_with').id() )
这种写法逻辑清晰,一眼就能看明白是取A的好友和B的好友的重叠部分,但用户数量多的话嵌套起来会比较繁琐,所以更适合两两查询的场景。
额外补充:
如果不只是要好友id,还需要获取好友的完整属性信息,可以在方案一的基础上稍作修改:
g.V().has('users','id', within('A', 'B')).out('friend_with') .groupCount().by('id') .unfold() .where(select(values).is(eq(2))) .select(keys) .map(g.V().has('users','id', it))
这样就能拿到每个共同好友的完整节点数据了。
备注:内容来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

