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

在Modern图中使用Gremlin project步骤报错:The provided traverser does not map to a value

解决Gremlin查询中Project步骤的错误问题

嘿,我来帮你搞定这个Gremlin查询的问题!你遇到的错误是因为在project的第二个by步骤里,使用aggregate('a').select('a')的方式不符合Gremlin对遍历器输出的要求——project的每个by步骤需要返回一个明确的值(或值的列表),而aggregate是一个副作用步骤,它不会改变当前遍历器的流,后续的select('a')虽然能拿到集合,但这种写法会让遍历器的输出不符合预期,所以触发了错误。

正确的查询语句

你想要的是获取每个person的姓名,以及他们创建的软件名称列表,用fold()就能直接实现这个需求,这也是Gremlin中处理这类“收集关联顶点属性为列表”场景的标准写法:

g.V().hasLabel('person').
  project('personName','softwareNames').
    by(values('name')).
    by(out('created').values('name').fold())

为什么原来的写法不行?

  • aggregate('a')的作用是把遍历过程中遇到的元素收集到一个名为a的全局变量里,但它本身不会修改当前遍历器的输出流,所以在这一步之后,遍历器还是在处理out('created').values('name')的每个元素,而不是直接返回集合。
  • 后续的select('a')虽然能拿到收集到的集合,但这种组合方式会让project的by步骤接收到不符合要求的遍历器输出,从而报错。而fold()会直接把当前分支的所有结果折叠成一个列表,正好满足project对值类型的要求。

如果非要用类似aggregate的方式,你可以用store()配合cap,但写法会更繁琐,比如:

g.V().hasLabel('person').
  project('personName','softwareNames').
    by(values('name')).
    by(out('created').values('name').store('a').cap('a'))

不过显然fold()的写法更简洁直观,推荐使用第一种方案。

内容的提问来源于stack exchange,提问作者cmant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:34:58