Azure Cosmos DB中Gremlin如何投影关联顶点及边的指定属性?
解决Gremlin查询中关联边与顶点的属性投影问题
你之前的思路方向是对的,但问题出在**fold()的调用顺序**上——你先把所有边/顶点折叠成了集合,再尝试对集合做project,这显然行不通,因为project是针对单个元素的操作。正确的做法是先对每条边、每个关联顶点单独做属性投影,再把投影后的结果折叠成列表。
下面是修正后的完整Gremlin查询,完全符合你期望的输出结构:
g.V().hasLabel('user') .project('id', 'prop1', 'prop2', 'edges', 'relatedVertices') .by(id()) .by('prop1') .by('prop2') .by( // 先对每条边做属性投影,再折叠成列表 bothE() .project('edgeId', 'edgeLabel', 'edgeInV', 'edgeOutV') .by(id()) // 边ID .by(label()) // 边标签 .by(inV().id()) // 入顶点ID(只取ID,不取完整顶点) .by(outV().id()) // 出顶点ID .fold() ) .by( // 先对每个关联顶点做属性投影,再折叠成列表 both() .project('vertexId', 'someProp1', 'someProp2') .by(id()) // 关联顶点ID .by('someProp1') // 指定属性1 .by('someProp2') // 指定属性2 .fold() )
关键细节说明:
- 边的入/出顶点处理:如果直接用
inV()或outV(),会返回完整的顶点对象(包含所有属性),所以我们追加id()来只提取顶点的ID,这正好匹配你期望的edgeInV和edgeOutV字段值。 - 关联顶点过滤(可选):如果你的关联顶点有多种标签,只想投影特定标签的顶点,可以在
both()后添加hasLabel()过滤,比如:both().hasLabel('post'),这样只会处理标签为post的关联顶点。 - 属性容错处理(可选):如果某些顶点可能缺失
someProp1或someProp2,可以用coalesce()来设置默认值,比如:.by(coalesce(values('someProp1'), constant(null))),避免查询出错。
执行这个查询后,你会得到完全符合预期的输出结构:
{ "id": "<userId>", "prop1": "value1", "prop2": "value2", "edges": [ { "edgeId": "<edgeId>", "edgeLabel": "<edgeName>", "edgeInV": "<relatedVertexId>", "edgeOutV": "<relatedVertexId>" } ], "relatedVertices": [ { "vertexId": "<vertexId>", "someProp1": "someValue1", "someProp2": "someValue2" } ] }
内容的提问来源于stack exchange,提问作者Dejan Janjušević
相关产品推荐
相关产品推荐

