You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:45:03