高性能Gremlin查询:获取指定深度节点及对应关联边
Gremlin实现指定深度出边出节点的树结构查询
需求
- 输入节点ID,定位图数据库中的目标根节点
- 查询根节点出发、指定深度范围内的所有出边与出节点
- 返回结果需直接明确边与节点的从属关系,无需客户端二次计算匹配,优先返回树结构
- 遍历深度支持自由配置
深度为2(从根节点向外完成2次跳转)的期望返回结构示例:
[rootNode, outgoingEdges[], outgoingNodes[ outgoingNode1, outgoingEdges[], outgoingNodes[ outgoingNode11, outgoingEdges[], outgoingNodes[] ], [outgoingNode2, outgoingEdges[], outgoingNodes[...]], [outgoingNode3, outgoingEdges[], outgoingNodes[...]] ]
上述结构中,outgoingNode1、outgoingNode2为rootNode的直接出节点,outgoingNode11为outgoingNode1的直接出节点。
原有方案缺陷
最初采用分步聚合的Java代码实现如下:
g.V('id').aggregate('node'). outE().aggregate('edges1'). inV().aggregate('refs1'). outE().aggregate('edges2'). inV().aggregate('refs2'). cap('node','edges1','refs1','edges2','refs2')
该方案虽然能拉取到全量所需数据,但节点、边分别存储在独立数组中,客户端需要额外编写关联计算逻辑,才能匹配节点和边的从属关系,无法满足计算逻辑下沉到服务端的要求。
实现方案
直接使用Gremlin内置的tree()步骤生成嵌套树结构结果,查询语句如下:
g.V('id').repeat(outE().inV()).times(2).tree()
使用要点:
- 修改
times()传入的数值即可自由调整遍历深度,例如传入3即对应从根节点出发3次跳转的查询范围 - 返回结果为原生嵌套树结构,每个节点直接挂载其对应的出边、下一级出节点,从属关系清晰,客户端拿到结果后无需额外做关联处理即可直接使用
内容的提问来源于stack exchange,提问作者Saleh Omar
相关产品推荐
相关产品推荐

