通过 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:[]]
我遵循了 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:[]]