【发布时间】: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
【问题讨论】: