从功能的角度来看,用于分页的 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 中找到有关此主题的其他一些想法。