如何用单条Gremlin查询获取指定顶点及其关联层级信息?
单条Gremlin查询实现企业层级多节点属性获取
需求回顾
查询CompanyA时,需一次性获取以下内容:
CompanyA自身的部分属性- 父节点
CompanyY的部分属性 - 子节点
CompanyB/CompanyC/CompanyD的部分属性 - 顶层父节点
CompanyX的部分属性
正确的单条查询实现
基于你当前的图结构(CompanyA节点存储了top_parent_number属性指向CompanyX),可以直接在project的分支中完成顶层父节点的查询,无需拆分两条语句:
g.V().has('name', 'CompanyA') .project('current', 'parent', 'children', 'top_parent') // 处理当前节点CompanyA的属性,将多值映射转为单值 .by( valueMap(true).unfold() .group().by(keys).by(select(values).limit(local, 1)) ) // 获取父节点CompanyY的指定属性 .by(in().valueMap('name','company_id').fold()) // 获取子节点B/C/D的指定属性 .by(out().valueMap('name','company_id').fold()) // 通过CompanyA的top_parent_number属性查找顶层父节点CompanyX .by( select('current').select('top_parent_number') .flatMap(g.V(it).valueMap('name','company_id') .unfold().group().by(keys).by(select(values).limit(local, 1)) ).fold() )
关键逻辑说明
current分支:复用你原有的逻辑,将valueMap返回的多值属性(默认是列表格式)处理为单值映射,同时保留节点的ID和标签(valueMap(true))。parent/children分支:直接沿用原查询的属性提取逻辑,确保结果格式统一。top_parent分支:- 通过
select('current')获取已处理好的CompanyA属性集合,提取其中的top_parent_number值; - 用
flatMap(g.V(it))根据该ID定位顶层父节点; - 同样用属性分组处理逻辑将顶层节点的属性转为单值映射,最后用
fold()保证结果格式和父/子节点一致(即使只有一个顶层节点也返回列表)。
- 通过
无直接ID存储时的替代方案
如果你的图结构中没有在CompanyA存储顶层父节点ID,而是需要通过层级遍历找到无父节点的顶层节点,可以用以下写法:
g.V().has('name', 'CompanyA') .project('current', 'parent', 'children', 'top_parent') .by(valueMap(true).unfold().group().by(keys).by(select(values).limit(local,1))) .by(in().valueMap('name','company_id').fold()) .by(out().valueMap('name','company_id').fold()) .by( repeat(in()).until(__.in().count().is(0)) .valueMap('name','company_id') .unfold().group().by(keys).by(select(values).limit(local,1)) .fold() )
该写法通过repeat(in()).until(__.in().count().is(0))向上遍历,直到找到没有父节点的顶层节点,再提取其属性。
内容的提问来源于stack exchange,提问作者Roshni Natarajan
相关产品推荐
相关产品推荐

