Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j Cypher,插入批量关系时出现死锁异常。_Neo4j_Locking_Cypher_Deadlock_Bulkinsert - Fatal编程技术网

Neo4j Cypher,插入批量关系时出现死锁异常。

Neo4j Cypher,插入批量关系时出现死锁异常。,neo4j,locking,cypher,deadlock,bulkinsert,Neo4j,Locking,Cypher,Deadlock,Bulkinsert,由于以下用例: (:Product)-[:HAS_PRICE]->(:Price)-[:HAS_CURRENCY]->(:Currency) 有1000种产品,只支持一(1)种货币,比如说(:currency{code:'USD'}) 要插入每个产品的价格,将针对节点(:Currency{code:'USD'})创建千(1000)个关系 有3个工作线程接收价格并进行设置,(:Currency{code:'USD'}节点将为其他两个工作线程锁定,而其中一个工作线程创建边缘-[“HAS

由于以下用例:

(:Product)-[:HAS_PRICE]->(:Price)-[:HAS_CURRENCY]->(:Currency)
有1000种产品,只支持一(1)种货币,比如说
(:currency{code:'USD'})

要插入每个产品的价格,将针对节点
(:Currency{code:'USD'}
)创建千(1000)个关系

有3个工作线程接收价格并进行设置,
(:Currency{code:'USD'}
节点将为其他两个工作线程锁定,而其中一个工作线程创建边缘
-[“HAS_Currency]->

实施重试/退避方法可以避免一些失败,但重试阈值必须足够高(在我的情况下大约为100),以避免所有死锁,设置长退避延迟是不值得的

Chris Vest评论了中锁定和事务隔离行为的修改

我们能做些什么来避免这个问题吗?关于服务器配置、数据建模等有什么建议吗


提前感谢。

您建模:货币与:价格分开有什么原因吗?除非:价格节点除了数字价格之外还有其他属性,否则我不太确定您从这个模型中得到了什么,因为:价格和:货币节点无论如何都需要配对(我怀疑您是否有相同的:Price节点映射到两个不同的:Currency节点,如果Currency映射到所有产品的所有相关价格,我看不出该映射有何用处)。最好只有一个:Price节点,该节点具有数字价格和货币代码的属性。此更改也可能会消除您的死锁。绝对是@InverseFalcon,原因有很多。有(:currency)作为一个实体是至关重要的,即涉及两种货币的货币转换。这很有意义,您肯定需要:货币节点来跟踪这些转换(是在节点本身中实现的,还是在:货币节点之间的关系中实现的?)。也就是说,虽然在:Price和:Currency之间建立关系可能仍有帮助,但通过按:Price的currencyCode查找:Currency仍然可以获得高效的查询性能(假设您将其添加到中)需要时。当然,这不是最面向图形的方法,但如果无法找到解决死锁问题的好方法,这可能是一种退路。您建模的原因是:货币与:价格分开吗?除非:价格节点除了数字价格之外还有其他属性,否则我不太确定您从这个模型中得到了什么s:Price和:Currency节点无论如何都需要配对(我怀疑您是否会将相同的:Price节点映射到两个不同的:Currency节点,如果货币映射到所有产品的所有相关价格,我看不出映射有何用处)。最好只有一个:Price节点,该节点具有数字价格和货币代码的属性。此更改也可能会消除您的死锁。绝对是@InverseFalcon,原因有很多。有(:currency)作为一个实体是至关重要的,即涉及两种货币的货币转换。这很有意义,您肯定需要:货币节点来跟踪这些转换(是在节点本身中实现的,还是在:货币节点之间的关系中实现的?)。也就是说,虽然在:Price和:Currency之间建立关系可能仍有帮助,但通过按:Price的currencyCode查找:Currency仍然可以获得高效的查询性能(假设您将其添加到中)当然,这不是最面向图形的方法,但是如果你不能找到一个很好的解决死锁问题的方法,这可能是一种退路。