【问题标题】:Enforcing a many-to-one relationship in noe4j using cypher使用密码在 noe4j 中强制执行多对一关系
【发布时间】:2014-08-13 16:59:09
【问题描述】:

假设两个实体 x 和 y 具有多对一关系。也就是说,x 的一个实例与 y 的一个实例正好相关。

此外,需要在多个用户更新关系的并发场景中强制执行此约束。

为了强制执行这种关系,neo4j 不允许我们对实体 x 和 y 的实例之间允许的关系数量进行限制。

为了使用 cypher 以编程方式强制执行关系约束,我们删除旧关系并创建一个新关系,如下所示。

match (x:x)-[r:relates_to]->(y:y) delete r delete y create (x)-[newr:relates_to]->(newy:y)

上述密码查询是使用密码事务 http 端点执行的。

我们使用 SoapUI 模拟并发请求,预期结果是:

  • 某些请求可能会失败,因为它们正在同时删除关系。没关系。
  • 因为密码查询是在事务范围内执行的,所以所有更改要么提交要么回滚。即,最终必须遵守多对一关系约束。

然而实际结果不同,并发更新导致数据不一致,实体x的一个实例被认为与实体y的多个实例相关。

什么可能导致不一致的关系,是否需要调整密码查询。

环境:

  • Noe4j 2.1.2
  • java 版本“1.7.0_45”
    Java(TM) SE 运行时环境(内部版本 1.7.0_45-b18)
    Java HotSpot(TM) 64 位服务器 VM(内部版本 24.45-b08,混合模式)
  • 操作系统 RHEL 5.5

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    旧版本曾经有一个功能:

    CREATE UNIQUE (x)-[newr:relates_to]->(newy:y) 
    

    我相信更新的版本已经被替换为

    OPTIONAL match (x:x)-[r:relates_to]->(y:y) 
    create (x)-[newr:relates_to]->(newy:y) 
    

    【讨论】:

    • 上述密码语句创建了一个新的关系'newr'以及一个新的目标节点'newy'。为了只删除关系并创建与现有节点的新关系 newy 用户密码: match (x:x)-[r:relates_to]->(y:y) match(newy:y{id: {inputId} )}) 删除 r 创建 (x)-[newr:relates_to]->(newy)
    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 2011-09-17
    • 2011-07-10
    • 1970-01-01
    • 2012-10-14
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多