Как выполнить разбиение на страницы в Гремлине

В Tinkerpop 3, как выполнить разбиение на страницы? Я хочу получить первые 10 элементов запроса, а затем следующие 10, не загружая их все в память. Например, запрос ниже возвращает 1000 000 записей. Я хочу получить их 10 на 10 без загрузки всего 1000 000 одновременно.

g.V().has("key", value).limit(10)

Изменить

Решение, которое работает через HttpChannelizer на сервере Gremlin, было бы идеальным.

Ответ 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]

С этой моделью вы только итерируете вершины один раз и не вносите их все в память в один момент времени.

Некоторые другие мысли по этой теме можно найти в этом блоге.