如何在Gremlin中进行分页

时间:2016-10-03 08:03:30

标签: gremlin tinkerpop3

在Tinkerpop 3中,如何进行分页?我想获取查询的前10个元素,然后接下来的10个元素而不必将它们全部加载到内存中。例如,下面的查询返回1000,000条记录。我想在不加载所有1000,000的情况下获取10×10。

g.V().has("key", value).limit(10)

修改

在Gremlin Server上通过HttpChannelizer运行的解决方案将是理想的。

2 个答案:

答案 0 :(得分:17)

从功能的角度来看,用于分页的Gremlin看起来很漂亮:

gremlin> g.V().hasLabel('person').fold().as('persons','count').
               select('persons','count').
                 by(range(local, 0, 2)).
                 by(count(local))
==>[persons:[v[1],v[2]],count:4]
gremlin> g.V().hasLabel('person').fold().as('persons','count').
               select('persons','count').
                 by(range(local, 2, 4)).
                 by(count(local))
==>[persons:[v[4],v[6]],count:4]

通过这种方式,您可以获得具有结果的顶点总数。不幸的是,fold()迫使你计算所有需要迭代所有顶点的顶点(即将它们全部放入内存中)。

在这种情况下,实际上没有办法避免迭代所有100,000个顶点,只要您打算在多次单独尝试中执行遍历。例如:

gremlin> g.V().hasLabel('person').range(0,2)
==>v[1]
==>v[2]
gremlin> g.V().hasLabel('person').range(2,4)
==>v[4]
==>v[6]

第一个语句与使用limit(2)终止遍历的情况相同。在第二次遍历时,只需要后两个顶点,就好像你神奇地跳过迭代前两个顶点,因为它是一个新的遍历。我不知道有任何TinkerPop图形数据库实现可以有效地做到这一点 - 它们都有这种行为。

一次执行十个顶点而不将它们全部放在内存中的唯一方法是使用与以下相同的Traversal实例:

gremlin> t = g.V().hasLabel('person');[]
gremlin> t.next(2)
==>v[1]
==>v[2]
gremlin> t.next(2)
==>v[4]
==>v[6]

使用该模型,您只需迭代顶点一次,并且不会在一个时间点将它们全部存入内存。

答案 1 :(得分:0)

为什么不对您的gremlin查询添加{ "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": "arn of lambda role" } } 并执行order().by()功能。