如何使用Gremlin从顶点返回属性,就像从顶点返回属性一样? (不是数组)

时间:2019-07-03 13:55:47

标签: gremlin amazon-neptune

我正在尝试从一组标记的顶点开始遍历,然后使它们的所有顶点通过一种特定类型的边连接,然后从那里开始,将这些顶点的属性作为对象返回。我可以用相同的标记顶点集开始的某些顶点做同样的事情,但是没有问题,但是在某些顶点尝试时会出现“提供的遍历器未映射到值:”错误。

我找到了一种解决方法,但这并不理想,因为它以长度为1的数组返回所需的属性值。

这是我如何在非顶点成功完成非常相似的任务:  g.V().hasLabel('TestCenter').project('address').by(out('physical').project('street').by(values('street1')))

这将返回类似

的信息
==>{address={street=561 PLACE DE CEDARE}}
==>{address={street=370 N BLACK STATION AVE}}

太好了!

然后,我尝试使用某些顶点进行相同类型的查询,如下所示: g.V().hasLabel('TestCenter').project('host').by(__.in('hosts').project('aCode').by(values('code'))) 并得到上述错误。

我能够找到的解决方法是将.fold()添加到最终的“ by”中,如下所示: g.V().hasLabel('TestCenter').project('host').by(__.in('hosts').project('aCode').by(values('code')).fold()) 但是我的回答是这样的

==>{host=[{aCode=7387}]}
==>{host=[{aCode=9160}]}

我想要的是这样的回复:

==>{host={aCode=4325}}
==>{host={aCode=1234}}

(注意:我不确定这是否相关,但是我正在将Gremlin连接到Neptune数据库实例)

1 个答案:

答案 0 :(得分:2)

在我看来,从上述错误和您的变通办法来看,并非您的所有“ TestCenter”都具有来自“主机”类型的边缘。使用project时,by必须映射一个有效值。

您可以做两件事:

1)确保在project中返回一个值:

g.V().hasLabel('TestCenter').project('host')
     .by(coalesce(__.in('hosts').project('aCode').by(values('code')), constant('empty')))

2)过滤器执行值:

g.V().hasLabel('TestCenter').where(__.in('hosts'))
.project('host').by(__.in('hosts').project('aCode').by(values('code')))