我正在尝试从一组带标签的顶点开始遍历,然后使它们的所有顶点通过一种特定类型的边缘连接,然后从那里将这些顶点的属性作为对象返回。我可以从同一组带标签的顶点开始的某些顶点做相同的事情,这没有问题,但是当我尝试使用某些顶点时出现“提供的遍历器未映射到值:”错误。
我发现了一种解决方法,但是它不是理想的,因为它以长度为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数据库实例)
从上面的错误和您的变通方法看来,并非所有“ 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')))
建议1并不是问题,因为代码始终存在(并且我已经尝试过这样做,以防万一只是得到相同的旧错误),但是建议2似乎可行!谢谢!!
另外,您知道为什么它可以与where过滤器一起使用,而不是我最初尝试的方式吗?
如我所写,我认为您拥有的“ TestCenter”没有“主机”类型的优势。尝试运行gV()。hasLabel('TestCenter')。not(__。in('hosts'))进行确认。
你是对的!我没有意识到这一点(事实并非如此),当我最初尝试您的第一个建议时,我得到了一个错误,但是我一定犯了一个错误。再次感谢。希望我有信誉来支持您的回答。