TinkerPop多.by()仅返回最后一个值的问题咨询与解决
问题分析与解决方案
1. 为什么多个.by()只返回最后一个值?
TinkerPop中,aggregate().by().by()的写法并非收集单个元素的多个属性,而是对每个元素依次应用每个.by()规则,将每个规则的结果单独加入聚合集合。同时,若多次调用.by(),后续的.by()会覆盖前序的规则(部分场景下会依次追加结果,但这并非你需要的“关联单个元素的多个属性”的效果)。
你的原查询中,aggregate("x").by("level").by("name")会对每个out("offers")的顶点,先提取level加入x,再提取name加入x,最终得到的是所有属性值的扁平列表,而非每个顶点的属性组合。
2. 返回结果中1的来源推测
根据你提供的图谱数据,School节点的out("offers")指向的Class顶点level均为2,但结果中出现1,可能是以下原因:
- 图谱中存在其他关联到
offers边的顶点(比如ClassReq节点的level为1,可能误被包含在路径中); - 查询执行时的上下文或数据存在偏差(比如属性值被错误写入)。
你可以通过单独查询验证out("offers")的顶点属性:
g.V().has("name", "Jefferson").out("offers").valueMap("name","level")
3. 如何返回顶点的多个字段值?
要为每个顶点聚合多个关联属性,需在单个.by()中使用project或map组合属性,而非多次调用.by():
方法1:使用project返回结构化Map(推荐)
g.V().has("name", "Jefferson").out("offers") .aggregate("x") .by(project("level", "name").by("level").by("name")) .cap("x")
返回结果示例:
[ [ {"level": 2, "name": "Math"}, {"level": 2, "name": "English"} ] ]
方法2:使用values返回属性值数组
g.V().has("name", "Jefferson").out("offers") .aggregate("x") .by(values("level", "name")) .cap("x")
返回结果示例:
[ [[2, "Math"], [2, "English"]] ]
针对.path()的场景
若你在使用path()时需要获取每个路径节点的多个属性,同样在.by()中嵌套project:
g.V().has("name", "Jefferson").out("offers").path() .by(project("nodeName", "nodeLabel").by("name").by(label)) .by(project("className", "classLevel").by("name").by("level"))
返回结果示例:
[ {"nodeName": "Jefferson", "nodeLabel": "School"}, {"className": "Math", "classLevel": 2} ], [ {"nodeName": "Jefferson", "nodeLabel": "School"}, {"className": "English", "classLevel": 2} ]
内容的提问来源于stack exchange,提问作者Ebad
相关产品推荐
相关产品推荐

