Я пытаюсь извлечь случайную выборку узлов из Neo4j, используя Gremlin. Осмотревшись вокруг, я не смог найти подходящий способ сделать это.
Я использую Neo4j через REST API.
Мой идеальный запрос будет выглядеть примерно так:
resultset.sample(50)
Очевидно, такого метода не существует. Осматривая, я нашел .random (), который будет излучать только случайные узлы. Я думал о том, чтобы сделать что-то вроде этого:
ratio = (50 / resultset.count()) * 1.25
resultset.random(ratio)
Цель состояла в том, чтобы получить случайный набор примерно того же размера, но с еще несколькими результатами. Из вызывающего скрипта я бы перетасовал его и выбрал первые 50. Однако это также не работает, так как результирующий набор пуст после подсчета.
Я также рассмотрел получение фиксированного соотношения и получение подмножества, но без перемешивания последние узлы имеют меньший шанс быть взятым, и я хочу избежать отправки большего количества данных, чем необходимо.
Я также мог бы получить набор результатов для заполнения дважды: один раз для подсчета и один раз для фильтрации. Тем не менее, это не кажется правильным.
Каким будет хороший способ получить случайную выборку?
Редактировать: (на основе комментариев Марко А. Родригеса
Я придумал следующее:
nodes = ... some expression ...
candidates = nodes.toList()
Collections.shuffle(candidates)
size = 50
if (candidates.count() >= size) {
return candidates[0..(size-1)];
} else {
return candidates;
}
Я нахожу последнее условие немного раздражающим, но нарезка завершается неудачей, если в ней меньше записей.
Кроме того, влияет ли это на большие наборы данных для Neo4j? Что касается сетевых коммуникаций, то это оптимально.