使用Gremlin,如何像从外顶点返回属性一样从内顶点返回属性?(不作为数组)

使用Gremlin,如何像从外顶点返回属性一样从内顶点返回属性?(不作为数组),gremlin,amazon-neptune,Gremlin,Amazon Neptune,我试着从一组带标签的顶点开始遍历,然后让它们的所有in顶点通过一种特殊的边连接起来,然后从那里,返回那些作为对象的in顶点的属性。我可以对从同一组标记顶点开始的一些out顶点执行相同的操作,没有问题,但是当我尝试对一些in顶点执行此操作时,会出现“提供的遍历器未映射到值”错误 我找到了一个解决方法,但它并不理想,因为它以长度为1的数组返回所需的属性值 下面是我如何在没有顶点的情况下成功完成非常类似的任务: g.V().hasLabel('TestCenter')。project('address

我试着从一组带标签的顶点开始遍历,然后让它们的所有in顶点通过一种特殊的边连接起来,然后从那里,返回那些作为对象的in顶点的属性。我可以对从同一组标记顶点开始的一些out顶点执行相同的操作,没有问题,但是当我尝试对一些in顶点执行此操作时,会出现“提供的遍历器未映射到值”错误

我找到了一个解决方法,但它并不理想,因为它以长度为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}}
这太棒了

然后,我尝试对一些in顶点执行相同的查询,如下所示:
g.V().hasLabel('TestCenter').project('host').by('hosts').project('aCode').by(values('code'))
并得到上述误差

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

==>{host=[{aCode=7387}]}
==>{host=[{aCode=9160}]}
我想要的是这样的回答:

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

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

从上面的错误和您的解决方案来看,并非所有的“测试中心”都有来自“主机”类型的in edge。使用
项目时
必须映射有效值

你可以做两件事:

1) 确保将在
项目中返回值

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')))

另外,奇怪的是,在末尾添加.limit(n),其中nsugestion 1不是问题,因为代码总是存在(我已经尝试过了,只是为了以防万一,只是为了得到相同的旧错误),但是建议2似乎有效!非常感谢。还有,你知道为什么这会和where过滤器一起工作,而不是我最初尝试的方式吗?正如我所写的,我认为你的“TestCenter”没有来自类型“hosts”的in-edge。尝试运行g.V().hasLabel('TestCenter')。而不是('hosts')来确认这一点。您是正确的!我不知道这一点(不应该是这样),当我最初尝试你的第一个建议时,我犯了一个错误,但我一定是犯了一个错误。再次感谢。我真希望我能有声誉来支持你的回答。