给出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)
看起来这个按预期工作
答案 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关系。
确保在关系中指明方向。另外,请使用“:”而不是“==”来引用属性值。