Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j/Cypher并发合并_Neo4j_Cypher_Graph Databases_Nosql - Fatal编程技术网

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无法创建重复节点。