我有以下应用模型和时间网络: 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的foreach部分。
答案 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
它遵循您的参数:
ON MATCH
MERGE
子句
ON CREATE
设置临时属性和尾部,其中&#34;先前的连接终止&#34;仅在该属性存在时才执行MERGE
创建指标(如果不存在),ON CREATE
设置[:INDICATES]
上的属性这种方法需要您放弃内部ID。
我在没有图表的情况下编写了这个查询来测试它,所以我可能错过了一些东西。如果您想更轻松地回答您的问题,可以在http://console.neo4j.org创建示例图表并添加指向您问题的链接。