如何在单次Gremlin查询中获取边及两端顶点的elementMaps?
解决Amazon Neptune中关联顶点与边的elementMap查询需求
环境
- Node 16
- Gremlin for JavaScript
- Amazon Neptune数据库
需求
列出所有Customer标签顶点与Workstream标签顶点间的HAS边,同时返回边和关联顶点的elementMap(),期望输出格式为:
[{ edge: { // 边的elementMap内容 outV: { // 出顶点的elementMap内容 }, inV: { // 入顶点的elementMap内容 } } }]
现有问题
之前的查询要么只返回顶点/边的基础对象(不带完整属性),要么只能拿到边的elementMap但关联顶点信息缺失;另外对边执行elementMap()后,关联顶点的键会从outV/inV变成OUT/IN,不符合预期格式。
解决方案查询语句
通过嵌套project和map步骤,直接组合出期望的格式,同时保留dedup处理重复顶点的逻辑:
g.V().has('Customer', 'name', 'Customer') .dedup().by('name') .as('outV') .outE('HAS') .as('edge') .inV().hasLabel('Workstream') .as('inV') .select('edge', 'outV', 'inV') .map( __.project('edge') .by( __.merge(select('edge').elementMap()) .with(__.project('outV', 'inV') .by(select('outV').elementMap()) .by(select('inV').elementMap()) ) ) ) .toList()
说明
- 重复顶点处理:保留你原有的
dedup().by('name')逻辑,避免名称重复的Customer顶点被多次遍历 - 格式定制:通过
merge把边的elementMap内容和手动指定的outV/inV字段合并,确保输出结构完全符合预期,同时避免默认elementMap中边的关联顶点键变为OUT/IN的问题 - 属性完整性:所有顶点和边的属性都会通过
elementMap()完整返回,不再出现properties: undefined的情况
示例输出
返回结果结构如下:
[{ edge: { id: '74c24101-55a9-3421-029b-1ddd68178cfd', label: 'HAS', // 边的其他属性 outV: { id: 'bac24101-555a-e70b-66b1-434c5b2bb4fe', label: 'Customer', name: 'Customer', // Customer顶点的其他属性 }, inV: { id: 'b8c24101-5548-f39e-70c9-a9bd126e05b2', label: 'Workstream', // Workstream顶点的其他属性 } } }]
内容的提问来源于stack exchange,提问作者ArobTheArab
相关产品推荐
相关产品推荐

