CREATE UNIQUE在不应该创建新节点时创建新节点

时间:2014-03-18 12:12:47

标签: neo4j cypher

给出2个类型为“System”的节点,我想设置一个属性并创建一个缺失的关系(如果它不存在,则为一个节点)

示例:

MATCH (s:System {Name: 'system1'})
SET s.ClusterPartner = 'system2'
WITH s
WHERE has(s.ClusterPartner)
CREATE UNIQUE (s)-[:ClusteredWith]-(c:System {Name: s.ClusterPartner})

在该查询之前我有2个类型为“System”的节点,并且两者都正确设置了Name属性('system1'和'system2'),它们之间没有任何关系。

此查询不仅会创建缺失的关系,还会创建一个名为“system2”的新节点,即使它存在。

也许我不理解文档,但我认为它应该只是在我的情况下创建缺失的关系,并且当'system2'节点不存在时,只关系一个新节点。

此查询有什么问题?

Update1 :使用合并方法:

MATCH (s:System {Name: 'system1'})
SET s.ClusterPartner = 'system2'
WITH s
WHERE has(s.ClusterPartner)
MERGE (c:System {Name : s.ClusterPartner})
MERGE (s)-[:ClusteredWith]->(c)

还将创建一个新的unlabled节点。

Update2 :使用合并和创建方法:

MATCH (s:System {Name: 'system1'})
SET s.ClusterPartner = 'system2'
WITH s
WHERE has(s.ClusterPartner)
MERGE (c:System {Name : s.ClusterPartner})
CREATE UNIQUE (s)-[:ClusteredWith]-(c)

看起来这个按预期工作

1 个答案:

答案 0 :(得分:2)

我认为您只需要以下查询。让我逐行解释:

MATCH (s:System {Name : 'system1'})
MERGE (c:System {Name : 'system2'})
MERGE (s)-[:ClusteredWith]->(c)

MATCH (s:System {Name : 'system1'})搜索名为'system1'的系统标记节点。如果它不存在,您的查询将退出。

MERGE (c:System {Name : 'system2'})将找到或创建一个名为'system2'的系统标记节点。

在您的场景中,

MERGE (s)-[:ClusteredWith]-(c)将创建一个ClusteredWith关系。

确保在关系中指明方向。另外,请使用“:”而不是“==”来引用属性值。