【问题标题】:Neo4j graph operations in a multithreaded environment多线程环境中的 Neo4j 图操作
【发布时间】:2012-10-03 02:35:18
【问题描述】:

我在并发环境中使用 Neo4j,我的图表如下所示:

每个项目都可以不处于或最多处于 3 种状态中的一种(S1S2S3)。一个项目可以改变它的状态,流程是这样的:项目在任何状态下都不存在,然后是S1S2,最后是S3

这意味着当添加一个项目时,我必须检查它是否已经存在于S1S2S3 中。如果是,那么我不应该再次添加它。此外,如果项目在 S1 中并且被请求进入流中的下一个状态,则必须首先从 S1 中删除项目,然后将其添加到 S2

对每个状态都有一个索引并不能解决这个问题,因为所有这些操作都必须以原子方式发生,因为它是一个并发环境。我检查了this link,我只能考虑采用悲观锁定 方法。基于示例添加新项目的伪代码应类似于:

search for node in all states
if node is present in any state
    return node
else
    begin transaction
        get a write lock on #lockNode#
        create node
        add node to initial state
    commit
    return node
end

从一个状态到另一个状态的伪代码应该和之前的非常相似。

所以问题是:

  1. 我的伪代码中的#lockNode# 是什么?我无法从示例中弄清楚。听起来类似于synchronized (lockNode) {},但我需要一点解释才能继续使用此解决方案
  2. 使用参考节点作为#lockNode#会有什么影响?
  3. 是否可以以原子方式和同步方式在三个索引中执行搜索,然后将节点添加/移动到某个状态?

我可以通过使用 Java 同步轻松解决此问题,但文档明确指出不应该这样做。对像我这样的 Neo4j 新手的任何帮助将不胜感激。

【问题讨论】:

    标签: java multithreading graph concurrency neo4j


    【解决方案1】:

    由于一个项目只能处于一种状态,因此您只能拥有一个索引并在您提供的链接中使用“获取或创建”技术。要了解项目的状态,您可以遍历 dingle 关系,然后遍历状态节点。或者您可以使用 2 个属性(名称和状态)进行索引。或者有4个索引

    锁定参考节点会造成瓶颈(如果只锁定 s1 节点会少一点),对于唯一节点创建我认为最好的方法是获取或创建的东西,我不知道其他好办法

    同步也是一个很大的禁忌,因为它可能与 neo4j 内部锁定系统“冲突”并产生死锁

    【讨论】:

      【解决方案2】:

      代码中的Lock-Node 是`lockNode.removeProperty("__non_existing_property") 或通过事务显式获取锁。

      Transaction tx = graphDb.beginTx();
      try {
          tx.acquireWriteLock( lockNode );
          // do something
          tx.success();
      }
      finally {
          tx.finish();
      }
      

      来自 Neo4j 手册: http://docs.neo4j.org/chunked/snapshot/transactions-unique-nodes.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多