首页 > 解决方案 > 如果不存在则创建关系和节点

问题描述

我有具有两种关系的组织和员工的图表:
(:Employee)-[:Worked]->(:Organization)
(:Employee)-[:Managed]->(:Organization)

组织具有Id带有索引的独特属性。员工拥有Name没有索引的财产。如果他不存在,我需要将新员工添加到组织中,或者如果他存在,则只添加新关系。但我不知道如何在没有索引的情况下实现这一点Name
1. 按 ID 查找组织。好的,这很快。
match (o:Organization {Id:1})
2. 查找已链接到组织的员工,如果不存在则添加新链接和员工。我不能使用简单
merge (e:Employee {Name: "name"})
merge (e)-[:Worked]->(o)
,因为我没有索引Name(这会很慢),我只需要找到连接到所选组织的员工
merge (e:Employee { Name: "name" })-[:Worked]->(o)不起作用 - 如果已经存在具有该名称但其他关系的员工,它将添加新员工,[:Managed]因为例子。

标签: performanceneo4jcypher

解决方案


您似乎误解了MERGE. 工作不需要索引MERGE

在您的特定情况下,:Employee(Name)不需要索引MERGE (e:Employee {Name: "name"})即可按预期工作。但是,拥有这样的索引加快该MERGE子句的处理速度,因此建议这样做。


推荐阅读