如果不存在,则创建关系和节点

时间:2018-06-05 00:18:56

标签: performance neo4j cypher

我的组织和员工的图表有两种类型的关系:
(: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]

2 个答案:

答案 0 :(得分:0)

您似乎误解了MERGE的要求。 MERGE无法使用索引。

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

答案 1 :(得分:0)

关于Neo4j如何处理Cypher MERGE操作以避免在使用时出现意外或意外行为,有一些简单的事情需要了解。

  1. Cypher MERGE操作是整个模式的MATCH或CREATE。这意味着如果模式的任何元素不存在,Neo4j将尝试创建整个模式。
  2. 对可能已存在的模式的每个部分始终合并。
  3. 在MERGE操作之后,您可以保证对Cypher MERGE操作期间建立的所有标识符都有可用的引用,因为它们已被找到或创建。
  4. 在CQL中合并dosent需要节点上的任何索引。您可以尝试以下方法:

    merge(:Employee) - [:< relation_name>] - >(:组织)

    如果指定的节点存在,则创建它们之间的关系,否则将创建新节点并创建它们之间的关系。