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_Cypher_Graph Databases_Nosql - Fatal编程技术网

Neo4j正在使用相同的密码创建多个节点和关系

Neo4j正在使用相同的密码创建多个节点和关系,neo4j,cypher,graph-databases,nosql,Neo4j,Cypher,Graph Databases,Nosql,我试图在Neo4j(v3.0.4)上动态生成密码来创建节点和关系,但我得到了一些奇怪的结果 我已经使用cypher查询一段时间了,我看不出我的查询有什么问题 因此,我有一个Neo4j数据库,它对:个人 CREATE CONSTRAINT ON (i:Individual) ASSERT i.id IS UNIQUE 鉴于此,我正在运行以下cypher查询: MERGE (parent:Individual {id:"334717eb182371a126e46d44bde3ef6b"}) SE

我试图在Neo4j(v3.0.4)上动态生成密码来创建节点和关系,但我得到了一些奇怪的结果

我已经使用cypher查询一段时间了,我看不出我的查询有什么问题

因此,我有一个Neo4j数据库,它对
:个人

CREATE CONSTRAINT ON (i:Individual) ASSERT i.id IS UNIQUE
鉴于此,我正在运行以下cypher查询:

MERGE (parent:Individual {id:"334717eb182371a126e46d44bde3ef6b"}) 
SET parent.name = "SOME PARENT NAME"
WITH parent 
OPTIONAL MATCH (parent)<-[del:IS_RELATIVE]-(n)

WITH parent, n, del 
DELETE del 
WITH parent 

CREATE (c1:Individual {name:"CHILD 1"}) 
CREATE (parent)<-[r1:IS_RELATIVE {birth:"2017-02-24"}]-(c1) 

CREATE (c2:Individual {name:"CHILD 2"}) 
CREATE (parent)<-[r2:IS_RELATIVE {birth:"2015-01-23"}]-(c2)
太棒了!预期结果。
但是如果我再次运行相同的查询,结果会是

Added 4 labels, created 4 nodes, set 11 properties, deleted 2 relationships, created 4 relationships, statement executed in 540 ms.
如果我再次运行相同的查询:

Added 8 labels, created 8 nodes, set 21 properties, deleted 4 relationships, created 8 relationships, statement executed in 192 ms.
然后

Added 16 labels, created 16 nodes, set 41 properties, deleted 8 relationships, created 16 relationships, statement executed in 583 ms.
请注意,第一个节点没有被复制,只是“子”节点及其关系

我不知道我错过了什么…

谢谢

我认为更简单的修复查询的方法是通过
MERGE
更改所有
CREATE
语句,如下所示:

MERGE (parent:Individual {id:"334717eb182371a126e46d44bde3ef6b"}) 
SET parent.name = "SOME PARENT NAME"
WITH parent 
OPTIONAL MATCH (parent)<-[del:HAS_CHILDREN]-(n)

WITH parent, n, del 
DELETE del 
WITH parent 

MERGE (c1:Individual {name:"CHILD 1"}) 
MERGE (parent)<-[r1:HAS_CHILDREN {birth:"2017-02-24"}]-(c1) 

MERGE (c2:Individual {name:"CHILD 2"}) 
MERGE (parent)<-[r2:HAS_CHILDREN {birth:"2015-01-23"}]-(c2)
MERGE(父项:个体{id:“334717eb182371a126e46d44bde3ef6b})
SET parent.name=“某个父名称”
与父母

可选匹配(父项)您只有一个唯一性约束用于
单个
节点的
id
属性

由于
name
属性没有唯一性约束,因此
CREATE(c1:Individual{name:“CHILD x”})
子句将始终创建新节点。创建这些节点时,需要指定
id
属性,以便在尝试重新使用现有
id
时查看约束错误

此外,您应该使用
MERGE
而不是
CREATE
,这样在违反约束时就不必处理错误,并且查询不会中止

例如:

MERGE (parent:Individual {id:"334717eb182371a126e46d44bde3ef6b"}) 
SET parent.name = "SOME PARENT NAME"
WITH parent 
OPTIONAL MATCH (parent)<-[del:IS_RELATIVE]-()

DELETE del 
WITH parent 

MERGE (c1:Individual {id: "1234567890"})
SET c1.name = "CHILD 1"
CREATE (parent)<-[r1:IS_RELATIVE {birth:"2017-02-24"}]-(c1) 

MERGE (c2:Individual {id: "2345678901"}) 
SET c2.name = "CHILD 2"
CREATE (parent)<-[r2:IS_RELATIVE {birth:"2015-01-23"}]-(c2)
MERGE(父项:个体{id:“334717eb182371a126e46d44bde3ef6b})
SET parent.name=“某个父名称”
与父母

可选匹配(家长)谢谢,但也不起作用。实际上,为了保证合并的唯一性,我必须在“name”属性上创建一个约束,这不是我想要的want@EltonHoffmann,我不知道我是否完全理解你的问题。根据文档,MERGE子句确保图形中存在模式。模式已经存在,或者需要创建它。我在这里运行了多次查询,没有重新创建节点。谢谢!我将把它标记为已解决,尽管这里使用MERGE不是为了匹配以前存在的节点,而是为了防止neo4j在2个并行流中运行相同的脚本,从而复制节点
MERGE (parent:Individual {id:"334717eb182371a126e46d44bde3ef6b"}) 
SET parent.name = "SOME PARENT NAME"
WITH parent 
OPTIONAL MATCH (parent)<-[del:IS_RELATIVE]-()

DELETE del 
WITH parent 

MERGE (c1:Individual {id: "1234567890"})
SET c1.name = "CHILD 1"
CREATE (parent)<-[r1:IS_RELATIVE {birth:"2017-02-24"}]-(c1) 

MERGE (c2:Individual {id: "2345678901"}) 
SET c2.name = "CHILD 2"
CREATE (parent)<-[r2:IS_RELATIVE {birth:"2015-01-23"}]-(c2)