2017-01-04 2 views
0

У меня есть запрос, возвращающий все узлы определенного типа. Я пытаюсь вернуть только 10 результатов, которые равномерно распределены по всему набору.neo4j: есть ли способ пропустить результаты, основанные на общей длине результата

Я пробовал:

$START t=node(*) 
MATCH (image:Image) RETURN image.name ORDER BY image.name 
SKIP toInt(count(image.name)/10); 

Однако это возвращает сообщение об ошибке, говорящее, что я не разрешено использовать переменные в SKIP.

Я думал, что я мог бы попробовать и повторно запустить все заявление в функции счета, то:

START t=node(*) 
MATCH (image:Image) RETURN image.name ORDER BY image.name 
SKIP toInt(count(MATCH (image:Image) RETURN image.name)/10); 

Однако это возвращает недопустимую ошибку ввода:

Invalid input 'R': expected whitespace, comment, '.', node labels, '[', "=~", IN, STARTS, ENDS, CONTAINS, IS, '^', '*', '/', '%', '+', '-', '=', "<>", "!=", '<', '>', "<=", ">=", AND, XOR, OR, ',' or ')' (line 3, column 38 (offset: 112)) 
"SKIP toInt(count(MATCH (image:Image) RETURN image.name)/10);" 
            ^
+0

Если вы только пытаетесь вернуть 10 результат, то почему бы не использовать 'LIMIT 10'? –

+0

@ GaborSzarnyas limit 10 возвращает только 10, все изображения сортируются по времени, и я хочу захватить 10 образцов с одинаковой дистанции (т. Е. Если бы у меня было 50 изображений в моем наборе, я бы хотел вернуть каждое пятое изображение) – user3297011

+0

Хорошо! Следующий вопрос: какую версию вы используете? Начиная с Neo4j 2.0+, вам не нужно предложение 'START' (вы никогда не используете значение' t'). –

ответ

0

Вы можете collect результатов к списку, а затем вернуть 10 элементов из коллекции:

MATCH (image:Image) 
WITH image.name AS imageName 
ORDER BY imageName 
WITH COLLECT(imageName) AS imageNames, range(0, 10) AS indices 
UNWIND indices AS index 
RETURN imageNames[toInt(length(imageNames) * index/10)] 

К получим индексы, мы создаем список из 10 чисел (0, ..., 9), UNWIND, они получают 10 отдельных строк и распределяют их по индексам.

Обратите внимание, что этот запрос не будет очень эффективным, так как сервер должен вычислить и собрать все результаты, но набор результатов будет содержать только 10 строк.

(Примечание: я не проверял запрос.)