2015-09-29 42 views
0

我有以下應用程序模型與時態網絡: Kpi可以有單個公制連接。Neo4j - 條件執行

我想用一個查詢來實現以下邏輯:

  1. 如果KPI早已公制連接老指標ID =新的指標ID,然後什麼也不做
  2. 如果KPI早已公制連接老公制然後終止上一個連接(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) 

任何選項使這個查詢更容易 - 尤其是foreach部分,我實際檢查當前度量標準節點中的空值。

+0

1)您是否考慮過使用其他標識符而不是內部標識符? 2)我假設'props'參數包含'to'屬性的值:這個值是否與'now'或'maxTime'相同? – jjaderberg

+0

使用其他ID不會有太大改變。 to = Long.MAX_VALUE now = new 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. 如果同一指標存在... - 有在MERGE
  2. 沒有ON MATCH子句如果不同的度量存在... - ON CREATE設置一個臨時屬性,並且只有在該屬性存在的情況下才會執行「上一次連接已終止」的尾部
  3. 如果沒有指標存在... - MERGE如果不存在,ON CREATE設置上[:INDICATES]

這種方法的屬性會要求你放棄內部IDS創建度量。

我寫了這個查詢沒有圖表來測試它,所以我可能錯過了一些東西。如果你想讓問題更容易回答,你可以在http://console.neo4j.org上創建一個示例圖並添加一個鏈接到你的問題。

+0

任何使用內部ID的選項? – Marcin