Gremlin:“使用项目时,提供的遍历器不会映射到值”

时间:2018-03-24 15:25:53

标签: graph-databases gremlin tinkerpop3

在Modern图中,我想为每个人找到他创建的软件的名称和名称列表。所以我尝试了以下查询

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

但我收到了错误

The provided traverser does not map to a value: v[2]->[VertexStep(OUT,[created],vertex), PropertiesStep([name],value), AggregateStep(a), SelectOneStep(last,a)]

问题似乎是顶点2没有“创建”边缘。

如果我只在具有至少一个“创建”边缘的顶点上运行它,则查询有效,例如对于顶点4(“V(4)”而不是“V()”),结果是

==>[personName:josh,softwareNames:[ripple,lop]]

如何获取顶点2的软件名称的空列表,而不是错误?

1 个答案:

答案 0 :(得分:4)

您可以将Gremlin简化为:

gremlin> g.V().hasLabel('person').
......1>   project('personName','softwareNames').
......2>     by('name').
......3>     by(out('created').values('name').fold())
==>[personName:marko,softwareNames:[lop]]
==>[personName:vadas,softwareNames:[]]
==>[personName:josh,softwareNames:[ripple,lop]]
==>[personName:peter,softwareNames:[lop]]

by()调制器只对传递给它的内部遍历执行next(),因此您需要自己减少结果 - 在这种情况下fold()执行此操作并处理你的结果是空的。