Поиск узлов с количеством соединений больше среднего

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

START n=node(*) 
MATCH n-[r]-() 
WITH n, count(r) AS cnt
WITH n, cnt, avg(cnt) AS av 
WHERE cnt > av
RETURN n, cnt

Но это возвращает 0 строк — я считаю, что «av» здесь равно «cnt».

Я задавался вопросом, поможет ли создание коллекции из cnt для перехода в avg, но это просто выдает ошибку.


person rldc    schedule 11.01.2013    source источник


Ответы (2)


Просто присоединяюсь. Вы также можете сделать это в одном запросе, используя WITH (даже с тем же синтаксисом, который рекомендует Вернер). Я также немного схитрил, используя длину и шаблон для подсчета... некоторые люди говорят, что это уродливо, но это позволяет избежать необходимости использовать агрегацию, которая упрощает подобные вещи.

START n=node(*) 
WITH avg(length(n--())) as avgr 
START n=node(*) 
WHERE length(n--()) > avgr 
RETURN length(n--()) as rc, avgr, n;

http://console.neo4j.org/r/2sp1rt

person Eve Freeman    schedule 14.01.2013

Вы должны сделать это с двумя запросами:

Один запрос, чтобы получить среднее количество подключений:

START n=node(*) 
MATCH n-[r]-() 
WITH n, count(r) as rc 
WITH avg(rc) as avg 
RETURN avg

А затем один запрос, чтобы вернуть узел с числом отношений выше среднего:

START n=node(*) 
MATCH n-[r]-() 
WITH n, count(r) as rc 
WITH avg(rc) as {avg_from_first_query} 
RETURN avg
person Werner Kvalem Vesterås    schedule 11.01.2013