繁体   English   中英

Neo4j图形操作在多线程环境中

[英]Neo4j graph operations in a multithreaded environment

我在并发环境中使用Neo4j,我的图形看起来像这样:

图形

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

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

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

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新手的帮助将不胜感激。

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

锁定引用节点将产生瓶颈(如果仅锁定s1节点则会少一点),对于唯一节点创建,我认为最好的方法是获取或创建的东西,我不知道任何其他好方法

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

代码中的锁定节点是`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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM