neo4j - py2neo MERGE 导致 ConstraintValidationFailed 并行化时节点已存在
问题描述
我正在尝试使用 MERGE 在 py2Neo 中使用多个进程并行化图形创建查询。这是请求:
def add_edge(start_node_name, start_type, end_node_name, end_type):
statement = """MERGE (A:Entity{Name:{Start}, Type:{T_start}})
MERGE (B:Entity{Name:{End}, Type:{T_end}})
MERGE (A)-[r:LINKED_TO]->(B) ON CREATE SET r.cnt = 1 ON MATCH SET r.cnt = r.cnt + 1"""
trans_action.run(statement, {"Start": start_node_name, "End": end_node_name, "T_start": start_type, "T_end": end_type})
对于遇到的每个节点,每个进程都多次执行相同的功能。节点“start_name”或“end_name”可以重复,这就是我使用 MERGE 的原因。
据我了解,使用 MERGE 可以防止多次创建节点:如果它与已经存在的节点匹配,它只会选择它并继续。但是,我刚刚收到来自 py2neo 的错误,指出:
py2neo.database.ClientError: ConstraintValidationFailed: Node(411606) already exists with label `Entity` and property `Name` = 'INSA RENNES'
这不应该发生,因为如果这是真的,该节点将只是匹配它会刚刚使用它。我看到的唯一原因是事务不能保证原子性,并且两个进程看到该节点不存在,因此试图同时创建它。根据我的理解,这又是不可能的,因为事务应该是原子的。除非这是 py2neo 的问题,但从错误消息来看,它看起来更像是 Neo 问题。
解决方案
推荐阅读
- typescript - 是否可以基于对象属性进行动态类型化?
- java - 共享状态:由一个线程访问 VS 许多线程 + 高级缓存
- php - $_SERVER['HTTP_REFERER'] 未显示 Facebook 页面完整网址
- aspose.words - aspose 用于 azure 功能部署的许可证路径
- c# - 如何在 C# 中优化多个 Web 请求?
- c++ - 断链时如何配置 clang-format 对齐?
- microsoft-teams - 规划师始终使用英语
- php - 对 directory_map() 的数字结果进行排序
- php - 函数 App\Http\Controllers\MainController::sendEmailDoneR() 的参数太少,通过了 2 个,预期正好有 3 个
- r - 矩阵的列标准化形式