Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让neo4j只检查密钥是否重复,而不检查其他属性_Neo4j - Fatal编程技术网

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

如何让neo4j只检查密钥是否重复,而不检查其他属性,neo4j,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

例如,假设设置了一个键

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是由第一行添加的现有“John”。谢谢


对于这种情况,我不会担心数据属性的比较,特别是如果这只是单个节点上的比较

您可以执行可选匹配而不是合并,但如果不存在这样的节点,则不会导致创建尝试:

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 (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在同一节点上匹配,并且不会将data属性设置为14,因为合并不会导致节点创建


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

非常感谢。我会试试看是否有性能差异。我们要添加8000万个节点,这是非常重要的。我们估计neo4j花费70%的时间来检查非关键属性,这对我们来说不是一个可以容忍的浪费。对于要添加的大量节点,请确保您使用的是LOAD CSV(使用定期提交)或以其他方式对负载进行批处理,这样您就不会耗尽堆。