在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
相关产品推荐
相关产品推荐

