如何用Gremlin查询指定节点的多跳朋友关系及子边节点?
问题描述
现有图结构如下:
bob -> friends -> jay jay -> friends -> mack jay -> friends -> john mack -> friends -> trevor
需求:
- 以Bob为起始顶点,2跳查询需返回:
bob->jay->mack bob->jay->john
- 3跳查询需额外包含
mack->trevor的关联关系
当前使用的Gremlin查询只能返回Bob的直接关联结果,无法实现多跳遍历:
results = g.V().has('person', 'bob').as('node'). union( bothE().hasLabel('friend').as('edge').otherV().has('person').as('connectedNode'), both().hasLabel('friend').dedup().as('connectedNode') ). project('node', 'edge', 'connectedNode'). by(select('node').valueMap().unfold().dedup().fold()). by(select('edge').valueMap().unfold().dedup().fold()). by(select('connectedNode').valueMap().unfold().dedup().fold()). toList()
请问正确的Gremlin查询语句应该如何编写?
解决方案
要实现多跳关联关系遍历,核心是用repeat()配合遍历控制逻辑来实现深度遍历,同时用path()捕获完整路径。以下是针对不同需求的具体写法:
1. 固定2跳查询(匹配需求结果)
g.V().has('person', 'bob') .repeat(out('friends')) .times(2) .path() .by('person')
该查询从Bob出发,沿friends边向外遍历2次,最终返回所有2跳完整路径,格式为[bob, jay, mack]和[bob, jay, john],可直接拼接成箭头格式。
2. 固定3跳查询(包含mack->trevor)
g.V().has('person', 'bob') .repeat(out('friends')) .times(3) .path() .by('person')
遍历3次后,除2跳路径外,还会得到[bob, jay, mack, trevor]的完整路径,自然包含mack->trevor的关联。
3. 通用多跳查询(可指定最大深度)
如果需要灵活控制最大遍历深度(比如同时获取1-3跳路径),可以用until()结合loops():
g.V().has('person', 'bob') .repeat(out('friends')) .until(loops().is(3)) // 最大3跳 .path() .by('person')
该查询会返回1跳(bob->jay)、2跳、3跳的所有路径。
4. 结构化结果查询(匹配原查询的project格式)
如果需要返回包含节点和边详细信息的结构化数据,可以在遍历中同时捕获边,并拆分路径段:
g.V().has('person', 'bob') .repeat(out('friends')) .emit() // 输出所有中间路径 .times(3) .path() .map { def segments = [] for (int i = 0; i < it.size() - 1; i++) { segments.add([ node: it.get(i).valueMap().unfold().dedup().fold(), edge: it.get(i).outE('friends').where(inV().is(it.get(i+1))).valueMap().unfold().dedup().fold(), connectedNode: it.get(i+1).valueMap().unfold().dedup().fold() ]) } segments }
这个写法会把每条完整路径拆分为一段段的node-edge-connectedNode结构,和你原查询的输出格式一致。
关键说明
原查询的问题在于仅遍历了Bob的直接邻居(1跳),没有使用repeat()实现循环多跳遍历。repeat()是Gremlin实现深度遍历的核心,times()用于指定固定遍历次数,until()可结合条件终止遍历,path()则负责保存遍历过程中的所有节点和边信息。
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

