gpt4 book ai didi

java - 多线程环境下的 Neo4j 图操作

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:46 30 4
gpt4 key购买 nike

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

Graph

每个项目都可以不处于任何状态或最多处于 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 新手的任何帮助,我们将不胜感激。

最佳答案

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

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

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

关于java - 多线程环境下的 Neo4j 图操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12701185/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com