2016-05-23 103 views
0

我写了一个简单的测试执行并发MERGE请求,并发现,虽然创建我希望唯一的节点空数据库的多个节点。的Neo4j/Cypher支架并发合并

[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)); 
    } 

我总是与索引字段两个节点落得像下面

Index 8 3 7 5 2 10 6 1 
Index 4 3 7 9 5 2 10 6 1 

我希望有一个节点与最新指标执行。

注意我所使用的.NET Neo4jClient

回答

2

我假设你没有对约束:节点(索引)属性。

CREATE CONSTRAINT ON (n:Node) ASSERT n.Index IS UNIQUE; 

MERGE是不是意味着要保证唯一性,它具有唯一约束保证ONLY

1

要解释为什么你得到重复:并发MERGE blah业务均受到了race condition,其中操作的每个实例检测blah尚不存在,使每个去进取,创造blah

避免这种情况的方法是通过使用uniqueness constraints,通过@ChristopheWillemsen所示。

+0

注意到对于未来的读者,比赛条件是在某些Neo4j的版本(版本3.1.X <3.0.9为3.0.x的版本,并<3.1.2)中的错误的结果,并且已被固定。这样做的目的是始终锁定保障,以便MERGE无法创建重复节点。 – InverseFalcon