Neo4j对延迟约束的支持

Neo4j对延迟约束的支持,neo4j,cypher,Neo4j,Cypher,假设对于某些节点,属性具有在其上定义的唯一约束 克隆节点时,我们将属性从原始节点复制到克隆节点,然后修改克隆节点上的唯一属性 然而,neo4j表现出急切的约束求值,并且似乎在将唯一属性从原始节点复制到克隆节点时失败 是否有办法将约束计算与事务结束时区分开来 或者一些暂时可以缓解问题的解决方法 用于说明问题的示例密码: 为属性id上标记为y的节点创建唯一约束 create constraint on (y:y) assert y.id is unique; 创建几个y节点 create (y:

假设对于某些节点,属性具有在其上定义的唯一约束

克隆节点时,我们将属性从原始节点复制到克隆节点,然后修改克隆节点上的唯一属性

然而,neo4j表现出急切的约束求值,并且似乎在将唯一属性从原始节点复制到克隆节点时失败

是否有办法将约束计算与事务结束时区分开来

或者一些暂时可以缓解问题的解决方法

用于说明问题的示例密码:

  • 为属性id上标记为y的节点创建唯一约束

    create constraint on (y:y) assert y.id is unique;
    
  • 创建几个y节点

    create (y:y{id: 1}) return y;
    create (y:y{id: 2}) return y;
    
  • 现在,尝试克隆id最大的y节点,并分配新id

    match (y:y) 
    with max(y.id) as maxid
    match (lasty:y{id: maxid})
    unwind range(1, 10) as i
    create (nexty:y)
    set nexty = lasty
    set nexty.id = maxid + i
    return nexty; 
    
  • 上述密码快速失效,错误如下:

    Node 5368657 already exists with label y and property "id"=[2]
    
  • 梅胡尔

    将查询更改为:

    MATCH(y:y)
    WITH max(y.id) AS maxid
    MATCH (lasty:y { id : maxid})
    UNWIND range(1, 10) AS i
    CREATE (nexty)
    SET nexty = lasty
    SET nexty.id = lasty.id + 1
    SET nexty :y
    RETURN nexty
    
    这将创建不带标签的新节点,传输和更新属性,然后添加标签

    恩典与和平


    吉姆,你的推荐很好用。填充节点属性后最后添加标签可以解决此问题。