使用cypher在noe4j中实现多对一关系

时间:2014-08-13 07:41:16

标签: neo4j cypher

考虑两个实体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)

使用cypher事务性http端点执行上述cypher查询。

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

  • 某些请求可能会失败,因为它们会同时删除该关系。这没关系。
  • 由于密码查询是在事务范围内执行的,因此所有更改都将提交或回滚。即必须最终尊重多对一关系约束。

但实际结果不同,并发更新会导致数据不一致,实体x的一个实例与实体y的多个实例相关。

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

环境:

  • 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

1 个答案:

答案 0 :(得分: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)