如何在Gremlin中进行分页

Moh*_*aie 11 gremlin tinkerpop3

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

g.V().has("key", value).limit(10)
Run Code Online (Sandbox Code Playgroud)

编辑

HttpChannelizer在Gremlin Server上运行的解决方案将是理想的选择.

ste*_*tte 21

从功能的角度来看,用于分页的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]
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以获得具有结果的顶点总数.不幸的是,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]
Run Code Online (Sandbox Code Playgroud)

第一个语句就像你终止遍历一样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]
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您正在使用HTTP,则不能.你必须切换到websockets然后你免费获得流媒体,或者如果你想更多地手动控制它,你可以使用会话. (4认同)