Neo4j агрегация для динамических значений - PullRequest
0 голосов
/ 24 мая 2018

Я работаю над процедурами APOC neo4j.Я не могу получить среднее значение расстояния для всех узлов, возвращаемых по нижеследующему запросу.

match(n:Company)  
WHERE NOT (n)-[:refersTo]->() and n.name starts with "google" 
with n as company, apoc.text.distance('google', n.name_lower) as distance  
return company.name, distance, avg(distance)

Значения расстояния и avg (расстояния) всегда одинаковы.Ниже изображение, прикрепленное к образцу результатов.

enter image description here

РЕДАКТИРОВАТЬ 1: Попытка предлагаемого запроса:

match(n:Company)  
WHERE NOT (n)-[:refersTo]->() and n.name_lower starts with "google" 
with n as company, apoc.text.distance('google', n.name_lower) as distance  
with company, collect(distance) as distances, avg(distance) as distAvg
unwind distances as distance
return company.name as name, distance, distAvg

Получены те же результаты.

enter image description here

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Этот запрос вернет коллекцию пар имя / расстояние и среднее значение всех расстояний:

MATCH (n:Company)  
WHERE NOT (n)-[:refersTo]->() AND n.name_lower starts with "google"
WITH n.name AS name, apoc.text.distance('google', n.name_lower) AS distance
RETURN COLLECT({name: name, distance: distance}) as data, AVG(distance) as distAvg;

Вот пример результата:

╒══════════════════════════════════════════════════════════════════════╤═════════╕
│"data"                                                                │"distAvg"│
╞══════════════════════════════════════════════════════════════════════╪═════════╡
│[{"name":"Google Inc.","distance":5},{"name":"Google Max","distance":4│4.5      │
│}]                                                                    │         │
└──────────────────────────────────────────────────────────────────────┴─────────┘
0 голосов
/ 24 мая 2018

Агрегация в Neo4j по отношению к столбцам без агрегации.В вашем запросе для каждой компании и ее расстояния вы получаете среднее значение этого единственного значения расстояния.

Вам необходимо либо свернуть, либо удалить значения distance (таким образом, среднее значение по всемрасстояния).Попробуйте вместо этого:

match(n:Company)  
WHERE NOT (n)-[:refersTo]->() and n.name starts with "google" 
with n as company, apoc.text.distance('google', n.name_lower) as distance  
with company, collect(distance) as distances, avg(distance) as distAvg
unwind distances as distance
return company.name as name, distance, distAvg

РЕДАКТИРОВАТЬ

Как отмечает cybersam, это дает среднее расстояние на компанию, а не в целом.Я приведу это в качестве примера того, как агрегация работает и может быть хитрой.Ответ Cybersam обеспечивает правильные способы агрегирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...