Neo4j正在使用相同的密码创建多个节点和关系
我试图在Neo4j(v3.0.4)上动态生成密码来创建节点和关系,但我得到了一些奇怪的结果 我已经使用cypher查询一段时间了,我看不出我的查询有什么问题 因此,我有一个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
:个人
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)