我的组织和员工的图表有两种类型的关系:
(: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]
。
答案 0 :(得分:0)
您似乎误解了MERGE
的要求。 MERGE
无法使用索引。
在您的特定情况下,为:Employee(Name)
按预期工作,不需要MERGE (e:Employee {Name: "name"})
上的索引。但是,使用这样的索引将加速该MERGE
子句的处理,因此建议使用。
答案 1 :(得分:0)
关于Neo4j如何处理Cypher MERGE操作以避免在使用时出现意外或意外行为,有一些简单的事情需要了解。
在CQL中合并dosent需要节点上的任何索引。您可以尝试以下方法:
merge(:Employee) - [:< relation_name>] - >(:组织)
如果指定的节点存在,则创建它们之间的关系,否则将创建新节点并创建它们之间的关系。