2015-09-29 5 views
0

У меня есть следующая модель приложения с временной сетью: Kpi может иметь одинаковую метрику.Neo4j - условное выполнение

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

  1. Если КПЭ уже метрическую подключен и старый Метрика ID = новый метрический идентификатор, то ничего не делать
  2. Если КПЭ уже метрический подключен и старый метрический id <> новый идентификатор metric, затем завершите предыдущее соединение (oldMetric.to = {now}) и создайте новое соединение между kpi и метрикой
  3. Если 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 в текущем метрическом узле.

+0

1) Считаете ли вы использование других идентификаторов, кроме внутреннего идентификатора? 2) Я предполагаю, что параметр 'props' содержит значение для свойства' to': это значение такое же, как или 'now' или' maxTime'? – jjaderberg

+0

Использование других идентификаторов не сильно меняется. to = Long.MAX_VALUE сейчас = новый DAte(). GetTime(), maxTime = Long.MAX_VALUE – Marcin

ответ

1

Что-то подобное может работать

MATCH (kpi:KpiIN {kpiId:{kpiId}) 
MERGE kpi-[r:INDICATES]->(m1:MetricIN {metricId:{metricId}}) 
    ON CREATE SET r = {props}, m1.created = 1 
WITH kpi, m1 
    WHERE HAS(m1.created) 
MATCH kpi-[r:INDICATES]->(m2:MetricIN) 
    WHERE m2.metricId <> {metricId} 
SET r.to = {now} 
REMOVE m1.created 

следует, вашим параметрам:

  1. Если же метрика существует ... - там нет ON MATCH пункта в MERGE
  2. Если другая метрика существует ... - ON CREATE устанавливает временное свойство и хвост, где «предыдущее соединение завершается» выполняется только в том случае, если это свойство существует
  3. Если нет метрики не существует ... - MERGE создает метрику, если не существует и ON CREATE устанавливает свойства на [:INDICATES]

Такой подход требует, чтобы вы отказаться от внутренних идентификаторов.

Я написал этот запрос без графика, чтобы проверить его, чтобы, возможно, что-то пропустил. Если вы хотите, чтобы было легче ответить на ваш вопрос, вы можете создать образец графика по адресу http://console.neo4j.org и добавить ссылку на свой вопрос.

+0

Любая опция с использованием внутренних идентификаторов? – Marcin

Смежные вопросы