Как отсортировать и ограничить результат 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]
(Ответ Алексея Теницкого тоже хорош)