Как я могу получить случайную выборку из Neo4j, используя Gremlin? - PullRequest
2 голосов
/ 20 февраля 2012

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

1 Ответ

2 голосов
/ 22 февраля 2012

Учитывая, что вам нужно определенное количество, вы можете сгенерировать список, а затем сэмплировать этот список. Например:

MyHelper.getRandomSampleFromList(my.particular.traversal.toList())

Учитывая, что вы не знаете, сколько результатов получит ваш обход, вы не можете получить заранее определенный размер выборки. Ваш MyHelper.getRandomSampleFromList (список списка) будет выглядеть примерно так:

Взять n случайных элементов из списка ?

...