AWS Neptune嵌套filter内count步骤异常与StopIteration报错问题
问题根因
该问题的核心是AWS Neptune对TinkerPop Gremlin的实现与开源TinkerGraph的语义实现差异导致,你的查询写法完全符合标准Gremlin语法规范,不存在使用错误。
在标准TinkerPop实现中,count()步骤会返回标准的单值流,外层filter()步骤可以直接读取该数值完成条件判断。而Neptune在嵌套filter的特定场景下,count()返回的单值会被封装为特殊的标量容器,外层filter无法正常解析该容器内的数值,会直接判定为无匹配结果,因此调用next()时会抛出StopIteration错误,调用toList()也会返回空列表。
规避方案原理
你找到的两种规避方案的生效逻辑如下:
count()后添加unfold()步骤:作用是拆解count()返回的标量容器,将其转换为标准的单元素流,外层filter可以正常读取流内的数值完成条件判断。
示例代码:g.V(count_headers).filter( __.out('edge').filter( __.in_('edge').hasId(filter_header) ).count().unfold().is_(P.gt(1)) ).count().next()- 使用
map()替代filter():Neptune中map()步骤的返回值解析逻辑和filter()不同,能够正常识别count()返回的封装标量值,不会出现值丢失的问题。
示例代码:g.V(count_headers).as_('c').map( __.out('edge').filter( __.in_('edge').hasId(filter_header) ).count().is_(P.gt(1)) ).select('c').count().next()
问题反馈渠道
如果需要反馈该问题,可以通过AWS官方支持通道提交工单,选择Neptune产品分类,附带复现代码和测试结果即可。
内容的提问来源于stack exchange,提问作者Hugh Blayney
相关产品推荐
相关产品推荐

