如何让neo4j只检查密钥是否重复,而不检查其他属性



例如,假设密钥设置为

CREATE CONSTRAINT ON (n:Person) ASSERT (n.name) IS NODE KEY

然后,如果您执行以下代码

MERGE (n1:Person{name:"John",data:13})
MERGE (n2:Person{name:"John",data:13}) // no error
MERGE (n3:Person{name:"John",data:14}) // key duplication error raised
MERGE (n4:Person{name:"Peter",data:15})
CREATE n3->[:pays]->n4 // want this line be executed with n3 being "John" added by the first line

对于第三行,将出现密钥复制错误,但对于第二行部neo4j引擎检查是否";数据";也被复制。然而,这可能会影响性能,因为我实际的";数据";属性是一个长文本。

我的问题是

我可以让neo4j只检查密钥重复,然后在密钥存在的情况下放弃创建而不检查其他属性吗?

此外,我不希望引发错误,并且需要执行第五行,其中n3是现有的"0";约翰;由第一行添加。谢谢

在这种情况下,我不会担心数据属性的比较,尤其是如果这只是单个节点上的比较。

您可以执行OPTIONAL MATCH而不是MERGE,但如果不存在这样的节点,则不会导致创建尝试:

MERGE (n1:Person{name:"John", data:13})
OPTIONAL MATCH (n3:Person{name:"John", data:14}) 
MERGE (n4:Person{name:"Peter",data:15})
WITH n4, coalesce(n3, n1) as n3 // if n3 is null will use n1 instead
CREATE (n3)-[:pays]->(n4)

或者,您可以将MERGE与ON CREATE一起使用来设置数据属性,以防MERGE导致节点创建:

MERGE (n1:Person{name:"John", data:13})
MERGE (n3:Person{name:"John"})
ON CREATE SET n3.data = 14
MERGE (n4:Person{name:"Peter",data:15})
CREATE (n3)-[:pays]->(n4)

在上面的例子中,因为您通过name属性合并了n3,所以它将与n1在同一个节点上匹配,并且不会将数据属性设置为14,因为MERGE没有导致节点创建。

需要注意的是,如果您对Person(name(有一个唯一的约束,您将得到类似的行为。唯一约束和节点键之间的主要区别在于,节点键还包括属性上的固有存在约束(该属性必须存在于该标签的所有节点上(,并且节点上的多个属性可以包含一个节点键。此外,节点键约束(如存在性约束(仅适用于企业版。对于社区版,请改用唯一约束。

最新更新