Gremlin查询需求:筛选指定用户的关联用户及层级拓展查询
Gremlin查询解决方案:筛选指定层级朋友中居住在目标城市的用户
1. 查找user_1的朋友中居住在chennai的用户
你的原查询走到了城市顶点,所以返回的是城市ID。要返回符合条件的用户,应该在朋友顶点层面做过滤,不用跳转到城市顶点再回溯。推荐两种写法:
写法一:使用where子句(简洁高效)
g.V('user_1').out('friend_of') .where(out('lives_in').has('id', 'chennai')) .values('id')
逻辑:先获取user_1的所有直接朋友,再筛选出那些lives_in边指向chennai的用户,最后返回用户ID。
写法二:使用match模式(可读性更强)
如果需要更清晰地表达路径关系,可以用match明确匹配"用户-朋友-城市"的路径:
g.match( __.V('user_1').as('me'), __.as('me').out('friend_of').as('friend'), __.as('friend').out('lives_in').has('id', 'chennai').as('city') ).select('friend').values('id')
2. 查找user_1的朋友及朋友的朋友中居住在chennai的用户
要覆盖直接朋友(1层)和朋友的朋友(2层),可以用两种方式实现:
写法一:使用repeat+emit(适合拓展更多层级)
g.V('user_1') .repeat(out('friend_of')) .emit() .times(2) // 限制遍历1-2步,对应朋友和朋友的朋友 .where(out('lives_in').has('id', 'chennai')) .dedup() // 去重,避免同一用户因多条路径重复返回 .values('id')
逻辑:repeat循环遍历朋友关系,emit()输出每一步的结果(1步和2步的顶点),times(2)限制最多走2步,之后过滤居住在chennai的用户,最后去重。
写法二:使用union合并层级(逻辑更直观)
如果只需要固定的1层和2层,用union直接合并两种路径的结果:
g.V('user_1') .union( out('friend_of'), // 直接朋友 out('friend_of').out('friend_of') // 朋友的朋友 ) .where(out('lives_in').has('id', 'chennai')) .dedup() .values('id')
内容的提问来源于stack exchange,提问作者user_coder
相关产品推荐
相关产品推荐

