Ответ 1
С функциональной точки зрения, приятный кусочек 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]
С этой моделью вы только итерируете вершины один раз и не вносите их все в память в один момент времени.
Некоторые другие мысли по этой теме можно найти в этом блоге.