У меня есть следующая модель приложения с временной сетью: Kpi может иметь одинаковую метрику.Neo4j - условное выполнение
Я хочу, чтобы достичь следующей логики с помощью одного запроса:
- Если КПЭ уже метрическую подключен и старый Метрика ID = новый метрический идентификатор, то ничего не делать
- Если КПЭ уже метрический подключен и старый метрический id <> новый идентификатор metric, затем завершите предыдущее соединение (oldMetric.to = {now}) и создайте новое соединение между kpi и метрикой
- Если kpi не имеет подключенных показателей, подключите новую метрику.
Другими словами: разорвать существующее соединение, если существует, и создать новую (+ ничего не делать, когда новое соединение равна предыдущей)
Вот мой высчитывать:
match (kpi:KpiIN)
where id(kpi) = {kpiId}
optional match (kpi)-[currentRel:Indicates]->(currentMetric:MetricIN)
where currentRel.to = {maxTime}
optional match (newMetric:MetricIN)
where id (newMetric) = {metricId}
with kpi, currentMetric, newMetric, currentRel
where COALESCE(id(currentMetric), -1) <> id(newMetric)
foreach (toTerminate in [x IN [currentRel] where x is not null] | set toTerminate.to = {now})
create (kpi)-[:Indicates {props} ]->(newMetric)
Любой вариант сделать этот запрос проще - особенно для части, где я фактически проверяю значение null в текущем метрическом узле.
1) Считаете ли вы использование других идентификаторов, кроме внутреннего идентификатора? 2) Я предполагаю, что параметр 'props' содержит значение для свойства' to': это значение такое же, как или 'now' или' maxTime'? – jjaderberg
Использование других идентификаторов не сильно меняется. to = Long.MAX_VALUE сейчас = новый DAte(). GetTime(), maxTime = Long.MAX_VALUE – Marcin