Gremlin查询中如何通用合并关联顶点属性完成全值投影
Gremlin顶点关联属性通用合并方案
完全不需要通过反射拼接by()步骤,Gremlin原生支持动态合并两个顶点的所有属性,适配关联顶点属性不固定的场景。
原生Gremlin通用写法
兼容所有版本的实现
g.V().hasLabel('Path') // 分别获取当前顶点、关联state顶点的所有属性 .project('selfProps', 'stateProps') .by(valueMap().by(unfold())) // unfold是为了把valueMap默认返回的单值数组展开为普通值 .by(out('state').valueMap().by(unfold())) // 合并两个属性Map为平级结构 .map(union(select('selfProps'), select('stateProps')).unfold().group().by(keys).by(select(values))) // 追加Id、Label等系统属性 .map(union( __.project('Id', 'Label').by(id).by(label), __.unfold() ).unfold().group().by(keys).by(select(values)))
Gremlin 3.6+ 简化写法
3.6及以上版本新增了mergeMap()步骤,代码更简洁:
g.V().hasLabel('Path') .map( // 先构造基础属性包含系统字段 __.valueMap('Id': id, 'Label': label).by(unfold()) // 直接合并关联state顶点的所有属性 .mergeMap(out('state').valueMap().by(unfold())) )
C# Gremlin.Net 适配实现
直接按原生语法转成强类型调用即可,不需要任何反射逻辑:
using static Gremlin.Net.Process.Traversal.__; using Gremlin.Net.Process.Traversal; // 3.6+版本写法 var traversal = g.V().HasLabel("Path") .Map( ValueMap<object>(new Dictionary<object, object> {{"Id", Id}, {"Label", Label}}) .By(Unfold()) .MergeMap(Out("state").ValueMap().By(Unfold())) ); // 执行查询,返回结果为包含所有合并属性的字典集合 var result = await traversal.ToListAsync();
如果服务端Gremlin版本低于3.6,替换为兼容写法即可:
var traversal = g.V().HasLabel("Path") .Project("selfProps", "stateProps") .By(ValueMap().By(Unfold())) .By(Out("state").ValueMap().By(Unfold())) .Map(Union(Select("selfProps"), Select("stateProps")).Unfold() .Group<object>().By(Keys).By(SelectValues)) .Map(Union( Project<object>("Id", "Label").By(Id).By(Label), Unfold() ).Unfold().Group<object>().By(Keys).By(SelectValues));
内容的提问来源于stack exchange,提问作者Pete Roberts
相关产品推荐
相关产品推荐

