Как отсортировать и ограничить результат Noe4j с помощью Gremlin?

Вот как вы можете сортировать (заказывать) результаты из графика Neo4j, используя Gremlin:

g.v(id).out('knows').sort{it.name}

или

g.v(id).out('knows').sort{a,b -> a.name <=> b.name}

Как ограничить результат с помощью offset/skip и limit:

g.v(id).out('knows')[0..9]

Однако, если вы комбинируете как сортировку, так и предел

g.v(id).out('knows').sort{it.name}[0..9]

он выкинул бы ошибку...

javax.script.ScriptException: groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList$ListItr.getAt() is applicable for argument types: (groovy.lang.IntRange) values: [0..9]
Possible solutions: getAt(java.lang.String), getAt(int), next(), mean(), set(java.lang.Object), putAt(java.lang.String, java.lang.Object)

Ответ 1

Мне потребовалось некоторое время, чтобы выяснить, что родные методы Groovy вроде sort не возвращают Pipes, но итераторы, итерации и т.д. Таким образом, чтобы преобразовать один из этих объектов обратно в поток Pipeline, вам нужно использовать _()

g.v(id).out('knows').sort{it.name}._()[0..9]

Ответ 2

У меня была аналогичная проблема, но с except(sth).unique() и limit [0..5]. В моем случае:

ERROR:

except(xxx).unique()[0..5]

Работает FINE:

except(sth).unique().findAll()[0..5]

Производит FINE также с сортировкой {}:

.unique().findAll().sort{it.sth}[0..5]

(Ответ Алексея Теницкого тоже хорош)