Performance 创建关系和节点(如果不存在)

Performance 创建关系和节点(如果不存在),performance,neo4j,cypher,Performance,Neo4j,Cypher,我有两种关系的组织和员工的图表: (:Employee)-[:Worked]->(:Organization) (:Employee)-[:Managed]->(:Organization) 组织具有唯一的属性Id,其上有索引。员工拥有不带索引的属性名称。我需要向组织中添加新员工(如果他不存在),或者仅在他存在时添加新关系。但是如果没有Name 1.按Id查找组织。好的,这很快。 匹配(o:Organization{Id:1}) 2.查找已链接到组织的员工,或添加新链接和员工(如果不存在)。我不

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

(:Employee)-[:Managed]->(:Organization)

组织具有唯一的属性
Id
,其上有索引。员工拥有不带索引的属性
名称
。我需要向组织中添加新员工(如果他不存在),或者仅在他存在时添加新关系。但是如果没有
Name

1.按Id查找组织。好的,这很快。
匹配(o:Organization{Id:1})

2.查找已链接到组织的员工,或添加新链接和员工(如果不存在)。我不能用简单的
merge(e:Employee{Name:“Name”})

merge(e)-[:Worked]->(o)

因为我没有关于
名称的索引(这会很慢),我只需要找到连接到所选组织的员工

merge(e:Employee{Name:“Name”})-[:Worked]->(o)
不起作用-如果已经存在具有该姓名但与其他关系的员工,
[:Managed]
例如,它将添加新员工。

您似乎误解了
merge
的要求。
合并
工作不需要索引


在您的特定情况下,不需要在
:Employee(Name)
上建立索引,才能使
合并(e:Employee{Name:“Name”})
按预期工作。但是,拥有这样一个索引将加快
MERGE
子句的处理速度,因此建议使用它。

关于Neo4j如何处理密码合并操作,有一些简单的事情需要了解,以避免在使用它时出现不希望出现的或意外的行为

  • 密码合并操作是整个模式的匹配或创建。这意味着,如果模式的任何元素都不存在,Neo4j将尝试创建整个模式
  • 始终在可能已经存在的模式的每个片段上合并
  • 在合并操作之后,您可以保证对在密码合并操作期间建立的所有标识符都有一个可用的引用,因为它们要么被找到,要么被创建
  • 在CQL dosent中合并需要节点上的任何索引。您可以尝试以下操作:

    合并(:雇员)-[:]->(:组织)


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

    我知道合并不需要索引,如果存在,则快速搜索节点需要索引。但是,大属性名称上的索引将是开销,我需要这种类型的搜索:“搜索名称=名称且链接到Id=Id的组织的员工”添加/删除索引节点(或更改索引属性值)时会遇到开销。与你需要进行匹配的次数(即你获得速度提升时)相比,这些情况通常很少发生。所以,除非你有一个罕见的情况,我只会添加索引。至少尝试一下,看看是否有一个整体的加速。如果发现索引会影响您的绩效,您可以随时删除该索引。如果员工存在,但与具有其他关系的组织连接,则将创建新节点。