2016-03-25 2 views
1

Follwing - это рабочий запрос, который я написал в cypher, используя выражение CASE в сочетании с математической функцией sign, чтобы обойти очевидный недостаток математического метода min.математический макс/мин в neo4j cypher

MATCH (a)-[ar:REL]->(b)<-[br:REL]-(c) 
RETURN CASE sign(ar.integer-br.integer) WHEN 1 THEN sum(br.integer) ELSE sum(ar.integer) END AS integer 
ORDER BY integer DESC 

мне нужно сравнить два числа и взять самый низкий один (то же самое можно было бы сделать для самого высокого), а затем просуммировать все самые низкие результаты. Это общие функции math.min или math.max, а не минимальные или максимальные статистические агрегации.

Есть ли лучший способ сделать это? Я что-то упускаю?

ответ

2

Этот запрос может сработать для вас.

MATCH (a)-[ar:REL]->(b)<-[br:REL]-(c) 
WHERE ID(a) > ID(b) 
RETURN b, SUM(
    CASE 
    WHEN ar.integer > br.integer THEN br.integer 
    ELSE ar.integer END) AS integer 
ORDER BY integer DESC 

Предложение WHERE используется для предотвращения повторных совпадений (в противном случае ваши суммы будут иметь двойные их правильные значения). Он также вычисляет SUM для каждого b (aggregation «Ключ группировки»), а затем сортирует результаты в порядке убывания. (Если вы не объединились с ключом группировки, тогда будет только одна сумма, поэтому сортировка не имеет смысла.)

+0

Спасибо. У меня был групповой ключ и некоторые опции «WHERE», которые я забыл вставить. Сожалею. В любом случае, «CASE» внутри 'sum()' в разделе «RETURN» является более чистым и правильным, как вы сказали. Большое спасибо! –