在Tinkerpop 3中,如何执行分页?我想获取查询的前10个元素,然后获取下10个元素,而不必将它们全部加载到内存中。例如,下面的查询返回1000,000条记录。我想以10乘10的方式获取它们,而不一次加载所有1000,000。
g.V().has("key", value).limit(10)
编辑
在Gremlin Server上通过
HttpChannelizer
起作用的解决方案将是理想的。
最佳答案
从功能的角度来看,用于分页的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]
使用该模型,您只需要迭代一次顶点,而不会在单个时间点将它们全部带入内存。
关于此主题的其他想法可以在此blog post中找到。
关于gremlin - 如何在Gremlin中执行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39826983/