Neo4j 合并和原子事务

2024-02-16

我正在运行下面的MERGE从客户端应用程序在 10 个并行线程中查询我的 Neo4j 服务器,newFoo and id所有 10 次运行的参数均相同:

MERGE (foo:Foo { id: {id} })
ON MATCH
SET foo = {newFoo}

运行此命令后,我运行以下查询以期望1但我反而得到10:

match (f:Foo)
return count(f)

我以为MERGE在原子事务中运行,但显然不是。我在这里做错了什么吗?

Update

下面是我用来重现该问题的代码:

public static async Task RunInParallel()
{
    var client = new GraphClient(new Uri("http://localhost:7474/db/data"), "neo4j", "1234567890")
    {
        JsonContractResolver = new CamelCasePropertyNamesContractResolver()
    };

    client.Connect();

    var foo = new Foo
    {
        Id = "1",
        Name = "Foo",
        Slug = "foo-bar-foo"
    };

    List<Task> tasks = new List<Task>();
    for (int i = 0; i < 10; i++)
    {
        var task = client.Cypher
            .Merge("(foo:Foo { id: {id} })")
            .OnMatch()
            .Set("foo = {newFoo}")
            .WithParams(new
            {
                Id = foo.Id,
                NewFoo = foo
            })
            .ExecuteWithoutResultsAsync();

        tasks.Add(task);
    }

    await Task.WhenAll(tasks.ToArray());
}

MERGE(本身)不保证唯一性。使用时MERGE(在独特的财产上)你应该总是创建一个唯一性约束 http://neo4j.com/docs/stable/query-constraints.html对于指定的属性:

CREATE CONSTRAINT ON (f:Foo) ASSERT f.id IS UNIQUE

这将确保您不会创建任何重复项。

Edit

MERGE没有唯一性约束不是线程安全的。添加唯一性约束可确保在写入之前持有索引锁,从而使操作线程安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Neo4j 合并和原子事务 的相关文章

随机推荐

  • 使用django反向传递查询参数?

    我有一个应该像这样访问的网址 people raj updates people raj updates tag food 但是 Django 反向 URL 解析器似乎没有任何规定可做tag food 即将其检测为额外参数并放入查询字符串中
  • 如果我使用 DOT 和 doxygen,如何更改由 graphviz 创建的图表在 HTML 中的位置?

    我在 doxygen 中使用 dot 和 Graphviz 以 HTML 格式创建代码的用户手册 doxygen 代码看起来有点像这样 br addtogroup MainProgram dot digraph G Main label M
  • C++ 编译器什么时候开始考虑字符串文字字符转义中超过两个十六进制数字?

    我在 C 中有一个 生成的 文字字符串 其中可能包含需要使用转义的字符 x符号 例如 char foo xABEcho 然而 g 版本 4 1 2 如果重要的话 会抛出错误 test cpp 1 error hex escape seque
  • Ecto 与某种情况的关联

    假设我有两个模型 Post and Comment评论模型可以是两种类型中的一种 normal and fancy由列定义type in the comments table 现在我想在我的上添加 2 个关联Post模型 其中一个指的是花哨
  • 如何切换到单击按钮后打开的新浏览器窗口?

    我遇到的情况是 当单击按钮时会打开带有搜索结果的新浏览器窗口 有什么方法可以连接并聚焦到新打开的浏览器窗口吗 并使用它 然后返回到原始 第一个 窗口 您可以按如下方式在窗口之间切换 Store the current window hand
  • 更新后自动缩小 Javascript/CSS 文件吗?

    我知道缩小 JS 和 CSS 文件的方法 但是有没有办法在生产系统中自动缩小这些文件 例如 我修改了原始JS文件中的一些内容并更新了生产环境 但是 在使用 JS 文件时 应该使用 JS 文件的自动缩小版本 如果源文件发生更改 最好更新当前的
  • Solr(太阳黑子),最大结果超过 30?

    我通过 Sunspot for Rails 使用 Solr 但我不知道如何返回超过 30 个结果 假设我有这个搜索块 posts Post search do keywords something end 我如何确定太阳黑子应该返回all比
  • Git 别名为新分支的名称添加前缀

    有没有办法编写一个别名 将当前日期添加到新分支的名称中 例如 git branch today new branch name 应该创建新分支22 09 2015 new branch name name 创建一个 git 别名并将其添加到
  • 识别串口/USB设备python

    这个问题的解决方案可能非常简单 但我对动态与设备交互还很陌生 我正在做的是制作一个Python可执行代码 这样用户的计算机上就不必有Idle或任何类型的Python解释器 这意味着我不知道设备将插入哪个USB端口到 该程序需要能够打开与通过
  • 在 Nginx docker 中,我们如何仅从 error.log 中查看日志

    Nginx Docker 文件配置为将 error log 发送到 dev stderr RUN ln sf dev stdout var log nginx access log ln sf dev stderr var log ngin
  • 检查文档是否为ROOT节点

    我需要知道文档元素是否是页面的根节点 例如 lt ROOT Node lt other document lt other document 在 iframe 1 或 2 中执行的 JavaScript 应该知道它们的文档节点是否是根节点
  • 新库中的异步方法与非异步方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 NET 4 5 中 有许多方法现在以异步和非异步对的形式出现 例如Flush and FlushAsync 理想情况下 I O 交互在可能的
  • 如何在 mac 上结束 Tkinter python 模块,以便在程序完成后不必强制退出 python 启动器?

    这是我的代码 from Tkinter import app Tk app title example app geometry 400x300 200 200 b Button app text quit command app quit
  • EF - 具有自动迁移功能的新列的默认值

    我首先使用 EF 代码和自动迁移 我想向我的模型添加一个新列 一个布尔列来表示 活动 真 或 非活动 假 如何添加此列并为数据库中已有的行设置默认值 true 通过自动迁移 Tamar 您需要设置默认值 请参阅下一个示例 namespace
  • 如何防止操作栏被切断?

    当我将手机升级到 Marshmallow 后 我制作的所有应用程序的操作栏都被切断了 该应用程序在 Lollipop 和 Kitkat 上运行良好 该应用程序基本上只有一个视图 并且在我更新后的手机上无法正确显示 上半部分被切断 https
  • SSIS LookUp Transformation高级编辑器(修改SQL语句)

    我对SSIS中的查找转换有一个疑问 复选框 修改SQL语句 和参数选项有什么用 提前致谢 泽兰 感谢您的回答高德曼 我有一个场景 比如我的查找 参考 表正在访问 DB2 并且在 DB2 中我们有多个架构 我的要求是将架构名称作为参数传递给查
  • 使用 Maven 生成类路径文件

    我想从 pom xml 依赖项生成一个类路径文件 我需要它 所以在测试期间我有所有依赖项的类路径 稍后打包成一个包 maven dependency plugin不适合我有两个原因 它生成存储库中文件的路径 因此要使用它们首先需要运行的其他
  • 如何在 mips 汇编中迭代字符串

    所以我现在正在做一个项目 我们必须接受一个字符串并将其转换为所有大写字母 然后如果 toUpper 或 toLower 字节不是 0 则转换为小写字母 现在我仍在处理大写字母部分 猜测小写字母几乎相同 但是当我遍历字符串查找大写字母时或者当
  • 为什么将 `this` 分配给 `self` 并运行 `self.method()`?

    我正在阅读来源mongoose https github com LearnBoost mongoose blob master lib collection js L40 Collection prototype onOpen funct
  • Neo4j 合并和原子事务

    我正在运行下面的MERGE从客户端应用程序在 10 个并行线程中查询我的 Neo4j 服务器 newFoo and id所有 10 次运行的参数均相同 MERGE foo Foo id id ON MATCH SET foo newFoo