@koliane

Как найти максимальное значение между несколькими определенными узлами в neo4j?

Пример: дан однонаправленный граф следующего вида:

CREATE 
(b0:Bar {id:1, value: 1}),
(b1:Bar {id:2, value: 4}),
(b2:Bar {id:3, value: 3}),
(b3:Bar {id:4, value: 5}),
(b4:Bar {id:5, value: 7}),
(b5:Bar {id:6, value: 9}),
(b0)-[:NEXT_BAR]->(b1),
(b1)-[:NEXT_BAR]->(b2),
(b2)-[:NEXT_BAR]->(b3),
(b3)-[:NEXT_BAR]->(b4),
(b4)-[:NEXT_BAR]->(b5);


Запрос:
MATCH (b1)->[*1..5]->(b2)->(b3)->[*1..5]->(b4)
WHERE // тут нужно написать условие, что максимальное значение между value узлов b3 и b4 больше, чем максимальное значение value узлов b1 и b2
RETURN //b1_b2_max, b3_b4_max

То есть, результат должен быть следующим:

b1_b2_max | b3_b4_max
4         | 9

Подскажите, как мне узнать агрегированную информацию между определенными узлами (включая эти узлы)?
Как должен выглядеть мой запрос?
  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
@koliane Автор вопроса
Решил таким образом:
Добавил в каждое ребро информацию о максимальном значении между вершинами и запрос получился следующего вида:
MATCH (b1)-[r1:NEXT_BAR*1..5]->(b2)-->(b3)-[r2:NEXT_BAR*1..5]->(b4)
UNWIND r1 AS maxes1 
UNWIND r2 as maxes2
with b1, b2, b3, b4, maxes1, maxes2
return b1.id, b2.id, b3.id, b4.id, max(maxes1.max) as max1, max(maxes2.max) as max2


Насколько я понял, аналогичное можно сделать и без добавления информации в ребра, но тогда запрос получается сложнее, с вызовом nodes, переменными ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы