Neo4j - 条件执行

时间:2015-09-29 12:28:10

标签: neo4j cypher

我有以下应用模型和时间网络: Kpi可以连接单个公制。

我想使用单个查询实现以下逻辑:

  1. 如果kpi已连接指标且旧指标ID =新指标ID,则不执行任何操作
  2. 如果kpi已连接指标且旧指标ID<>新指标ID,然后终止先前的连接(oldMetric.to = {now})并在kpi和指标之间创建新连接
  3. 如果kpi没有连接任何指标,请连接新指标。
  4. 换句话说:如果存在则断开现有连接,并创建一个新连接(当新连接等于前一个时,+什么都不做)

    这是我的密码:

    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的foreach部分。

1 个答案:

答案 0 :(得分: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
  2. 中没有MERGE子句
  3. 如果存在不同的指标... - ON CREATE设置临时属性和尾部,其中&#34;先前的连接终止&#34;仅在该属性存在时才执行
  4. 如果不存在指标... - MERGE创建指标(如果不存在),ON CREATE设置[:INDICATES]上的属性
  5. 这种方法需要您放弃内部ID。

    我在没有图表的情况下编写了这个查询来测试它,所以我可能错过了一些东西。如果您想更轻松地回答您的问题,可以在http://console.neo4j.org创建示例图表并添加指向您问题的链接。