首页 文章

Neo4j正在创建多个节点和与同一个密码的关系

提问于
浏览
1

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

我一直在使用cypher查询一段时间,我在这里看不出我的查询有什么问题

所以我有一个Neo4j数据库,对 :Individuals 的唯一 id 有约束

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 3 labels, created 3 nodes, set 7 properties, created 2 relationships, statement executed in 1201 ms

哪个好极了!预期的结果 .
但是,如果我再次运行 same 查询,则会产生结果

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.

并注意到第一个节点没有重复,只有“孩子”与他们的关系......

我不想't know what I'
谢谢

2 回答

  • 1

    我相信修复查询的更简单方法是更改 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)
    

    这样,您可以多次运行上述查询,并且不会再次创建节点 .

  • 0

    对于 Individual 节点的 id 属性,只有唯一性约束 .

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

    此外,您应该使用 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)
    

    如果子节点已存在(具有相同的 id ),但它没有您要分配给它的名称,则上述查询将在单独的 SET 子句中设置名称 . (如果在 MERGE 子句中保留了 name 属性,如果已经存在具有相同 id 的节点但是名称不同,则会出错 . )

    注意:如果孩子已经拥有不再合适的关系,您可能还需要考虑该怎么做 .

相关问题