Neo4j/Cypher并发合并
我编写了一个简单的测试来执行并发的Neo4j/Cypher并发合并,neo4j,cypher,graph-databases,nosql,Neo4j,Cypher,Graph Databases,Nosql,我编写了一个简单的测试来执行并发的MERGE请求,并发现在空数据库上创建了多个节点,尽管我希望节点是唯一的 [Test] public void ConcurrentNodeMerge() { // act Parallel.ForEach(Enumerable.Range(1, 10), index => { client.Cypher .Merge("(n:N
MERGE
请求,并发现在空数据库上创建了多个节点,尽管我希望节点是唯一的
[Test]
public void ConcurrentNodeMerge()
{
// act
Parallel.ForEach(Enumerable.Range(1, 10), index =>
{
client.Cypher
.Merge("(n:Node)")
.Set("n.Index = COALESCE(n.Index, '') + ' ' + {index}")
.WithParam("index", index.ToString())
.ExecuteWithoutResults();
});
// assert
var result = client.Cypher
.Match("(n:Node)")
.Return<string>("n.Index")
.Results;
Assert.That(result.Count(), Is.EqualTo(1));
}
我希望有一个执行了最新索引的节点
注意我使用了.NET Neo4jClient我假设您对:Node(index)属性没有约束
CREATE CONSTRAINT ON (n:Node) ASSERT n.Index IS UNIQUE;
合并
并不意味着保证唯一性,它只保证具有唯一约束。我假设您对:节点(索引)属性没有约束
CREATE CONSTRAINT ON (n:Node) ASSERT n.Index IS UNIQUE;
合并
并不意味着保证唯一性,它只保证有一个唯一的约束。为了解释为什么会得到重复:并发的合并blah
操作受到一个约束,其中操作的每个实例检测到blah
还不存在,使每一个都继续并创建废话
避免这种情况的方法是使用,如@ChristophenWillemsen所示 解释您获得重复的原因:并发的
合并blah
操作受到一个限制,其中操作的每个实例检测到blah
不存在,导致每个操作继续并创建blah
避免这种情况的方法是使用,如@ChristophenWillemsen所示 对于未来的读者,请注意,争用条件是某些Neo4j版本(3.0.x版本<3.0.9,3.1.x版本<3.1.2)中的一个错误造成的,并且已经修复。其目的始终是为了锁定保证,以便MERGE无法创建重复节点。请注意,对于未来的读者,争用条件是某些Neo4j版本(对于3.0.x版本<3.0.9,对于3.1.x版本<3.1.2)中的一个错误造成的,并已修复。其目的始终是锁定保证,以便MERGE无法创建重复节点。