Я пытаюсь извлечь случайную выборку узлов из 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? Что касается сетевых коммуникаций, то это оптимально.