Neo4j 创建唯一节点在不应创建新节点时创建新节点

Neo4j 创建唯一节点在不应创建新节点时创建新节点,neo4j,cypher,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}) 在该查询之前,我有两个类型为“Sys

给定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})
在该查询之前,我有两个类型为“System”的节点,它们的Name属性设置正确(“system1”和“system2”),它们之间没有任何关系

此查询不仅会创建缺少的关系,还会创建名为“system2”的新节点,即使该节点存在

也许我不理解文档,但我认为应该在我的案例中创建缺少的关系,并且只有关系在“system2”节点不存在时创建一个新节点

这个查询有什么问题

更新1:使用合并方法:

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)
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)
还将创建一个新的未启用节点

更新2:使用合并和创建方法:

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)
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)

看起来这一个工作正常

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

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关系


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

修复了从==到:…的属性匹配。。这只是一个输入错误,谢谢。好的,这个查询对你有用吗?还是你想做其他事情?目前没有,我更新了我的问题。也许我不能在一个查询中使用Set和MERGE/CREATE UNIQUE?另一个问题,为什么要使用
WHERE has(s.ClusterPartner)
?您在第2行显式设置了它。您正在使用字符串文字设置它,因此它不能为null。但是,也许您的实际查询中有参数?您是否可以与
合并
查询无法按预期工作的数据共享控制台?我运行了
CREATE(s:System{Name:'system1'}),(:System{Name:'system2'})
并从“update1”粘贴了您的查询,看起来效果不错。感谢您的参与。我也不知道会有什么不同。我很想知道@贾德伯格:我无法在console.neo4j.org上发布。。但在我的本地Neo4j 2.0上,Win 8.1 64位有什么建议?合并或创建唯一?Neo4j 2.0不推荐合并为创建唯一。