通过 RangeLocalStep(0,1) 的 Gremlin 分页在空遍历时失败

Gremlin pagination via RangeLocalStep(0,1) fails on an empty traversal

我遵循了 Gremlin pagination receipe 并发现它在所有情况下都能正常工作,除非你要求 1 项反对空遍历,然后它失败并出现错误:

提供的开始未映射到值:[]->[NeptuneMemoryTrackerStep, RangeLocalStep(0,1)]

从非空遍历中请求一项工作正常。从空遍历中求 0 项、2 项或 10,000 项也可以!

行为符合预期,没有错误,除非从空遍历中请求 正好 1 个项目

当消费者只要求一件商品时,如何使分页具有弹性并应对找不到数据的查询?

g.inject([])
.as('items','count')
.select('items','count')
.by(range(local, 0, 1))
.by(count(local))
.project('count', 'items')
.by(select('count'))
.by(select('items'))

顺便说一句,这是 AWS Neptune 上的 运行。

运行 Gremlin 控制台中的查询可能进一步说明了为什么在第一种情况下值为 2 而在第二种情况下值为 1 会发生这种情况。

gremlin> g.inject([]).
......1>  as('items','count').
......2>  select('items','count').
......3>  by(range(local, 0, 2)).
......4>  by(count(local)).
......5>  project('count', 'items').
......6>  by(select('count')).
......7>  by(select('items')) 
==>[count:0,items:[]]


gremlin> g.inject([]).
......1>  as('items','count').
......2>  select('items','count').
......3>  by(range(local, 0, 1)).
......4>  by(count(local)).
......5>  project('count', 'items').
......6>  by(select('count')).
......7>  by(select('items'))    
The provided start does not map to a value: []->[RangeLocalStep(0,1)]  

发生这种情况的原因是任何长度大于 1 的 range 调用都会 return 一个列表。但是,当最多可以 returned 一个项目时,单个值得到 returned,在这种情况下本质上是“无”,因此没有任何价值可以放入最终 project 结果。如果您希望遇到空结果和长度范围为 1 的情况,则必须更改查询以允许这样做。

为了进一步说明差异,请参见下面的示例:

gremlin> g.inject([1,2,3]).range(local,0,2)
==>[1,2]

gremlin> g.inject([1,2,3]).range(local,0,1)
==>1   

这是一种调整查询的方法,以便所有这些情况仍然产生结果。

gremlin> g.inject([]).
......1>  as('items','count').
......2>  select('items','count').
......3>  by(coalesce(range(local, 0, 1),constant([]))).
......4>  by(count(local)).
......5>  project('count', 'items').
......6>  by(select('count')).
......7>  by(select('items')) 

==>[count:0,items:[]]