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