Как я могу получить случайную выборку от Neo4j с помощью Gremlin?

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


person Louis-Philippe Huberdeau    schedule 20.02.2012    source источник


Ответы (1)


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

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

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

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

person Marko A. Rodriguez    schedule 21.02.2012
comment
Это то, что я пытался сделать. В другом вопросе, на который вы указали, упоминается Collections.shuffle(), поэтому, если мне удастся его использовать, это частично решит проблему. Я могу просто выбрать гораздо большее соотношение, чем мне нужно, и все равно не отправлять все через REST. Я вернусь к вам по этому поводу. - person Louis-Philippe Huberdeau; 22.02.2012
comment
Я обновил вопрос, чтобы оставить более полный ответ для дальнейшего использования. Любые комментарии? Ваша помощь очень ценится. - person Louis-Philippe Huberdeau; 22.02.2012