【问题标题】:Multiprocessing and Neo4J Insertion/Update via py2neo通过 py2neo 进行多处理和 Neo4J 插入/更新
【发布时间】:2020-01-22 15:56:01
【问题描述】:

我从事的项目需要通过 py2neo 快速将大量信息播放到 Neo4J 中,而我在尝试使用 Python 的多处理库来加快该过程时遇到了障碍。

一般来说,我们正在做的是双重的,两个部分同时发生:

第 1 部分:

  • 在一对节点 (A->B) 之间创建关系
  • 创建另一个节点,该节点与前一对(C->A,C->B)中的每一个都有一个关系
  • 将所有 3 个节点及其关系推送到 Neo4j 中,
  • 将节点 C 的 ID 推送到 kafka 主题

第 2 部分:

  • 通过python的多处理创建N个“线程”,都打开自己的kafka消费者
  • 消费者阅读主题,并执行可能更新关系/节点或创建其他关系/节点的代码。

出现的问题发生在第 2 部分,特别是在更新或创建关系或节点时。 py2neo 正在抛出一个py2neo.database.TransientError,根据文档,它是:

数据库目前无法为请求提供服务,稍后重试可能会产生成功结果。

我已尝试添加安全检查,该检查将重试事务 X 次,并在 X 次尝试失败后将其重新推送到 kafka 主题以供另一个线程尝试,但最终结果仍然不正确。

我对多线程/多处理一无所知,所以我觉得我最初的研究工作已经严重偏离基础,我浪费了很多周期来试图解决这个问题——任何方向或洞察力不胜感激。

如有必要,可以提供更多信息——不确定我可能遗漏了什么。

谢谢

【问题讨论】:

    标签: python neo4j py2neo


    【解决方案1】:

    我认为问题在于您尝试写入被其他查询阻止的节点/关系。这与 py2neo 无关,在使用另一个库/框架进行并行写入时,您应该会遇到类似的问题。见这里:https://neo4j.com/docs/java-reference/4.0/transaction-management/locking/

    py2neo 错误和文档在这种情况下没有多大帮助。

    重试 X 次可能适用于小型工作负载,在这些工作负载中您可以预期写入锁会快速释放。但是,如果您不断写入图表的相同部分,您将无法预测行为。有些写入可能会永远卡在循环中。

    可能的解决方案

    • 拆分读/写任务,只有一个进程写入 Neo4j
    • 以避免并行写入锁定节点的方式预处理数据

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      相关资源
      最近更新 更多