gpt4 book ai didi

Neo4j/Cypher 在高并发环境中创建独特的关系

转载 作者:行者123 更新时间:2023-12-05 01:14:45 30 4
gpt4 key购买 nike

我需要为给定的关系类型设置某种唯一约束。

(a)-[:RELATION]->(b)

为了实现这一点,我正在使用 CREATE UNIQUE (a)-[:RELATION]->(b)

在并发环境中,如果多个线程可以在相同节点之间创建 (a)-[:RELATION]->(b),我将得到 UniquePathNotUniqueException 和多个关系由于 neo4j 事务隔离的性质而创建。

我发现目前创建唯一关系的唯一方法是写锁定两个节点。

是否有其他方法可以创建有保证的独特关系?

更新

这是我最后使用的方法

MATCH (a), (b) 
SET a._lock_ = true, b._lock_ = true
MERGE (a)-[:RELATION]->(b)
REMOVE a._lock_, b._lock_

使用带有指数退避过程的附加重试循环可能会出现死锁。

最佳答案

您需要对关系使用MERGE,但在此之前您需要获取锁以防止并发问题。作为删除不存在的属性的副作用,这是最容易完成的:

MATCH (a:Label{key:value}), (b:Label{key:value2})
REMOVE a._non_existing_property, b._non_existing_property
MERGE (a)-[:RELATION]->(b)

更新

我上面的陈述有死锁的危险(Neo4j 会检测到并优雅地处理)。为了防止必须以一致的顺序获取锁,例如通过较小的节点 ID:

MATCH (a:Label{key:value}), (b:Label{key:value2})
WITH a, b, case when id(a) < id(b) then a else b end as locknode
REMOVE locknode._non_existing_property
MERGE (a)-[:RELATION]->(b)

关于Neo4j/Cypher 在高并发环境中创建独特的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38380355/

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