【问题标题】:Neo4j support for deferred constraintsNeo4j 对延迟约束的支持
【发布时间】:2014-10-30 07:52:06
【问题描述】:

假设对于某些节点,属性上定义了唯一的约束。

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

但是,neo4j 表现出急切的约束评估,并且一旦将独特属性从原始节点复制到克隆节点,它似乎就会失败。

有没有办法将约束评估与事务结束不同?

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

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

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

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

    create (y:y{id: 1}) return y;
    create (y:y{id: 2}) return y;
    
  3. 现在,尝试克隆 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; 
    
  4. 上述密码快速失败并出现以下错误:

    Node 5368657 already exists with label y and property "id"=[2]
    

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    梅胡尔,

    将您的查询更改为:

    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
    

    这将创建没有标签的新节点,传输和更新属性,然后添加标签。

    恩典与和平,

    吉姆

    【讨论】:

    • 吉姆,你的推荐很完美。填充节点属性后最后添加标签即可解决问题。
    猜你喜欢
    • 2010-11-03
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2013-05-15
    • 2015-09-02
    • 2012-04-28
    • 2013-04-25
    相关资源
    最近更新 更多