首页 > 解决方案 > 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 问题。

标签: neo4jcypherpy2neo

解决方案


推荐阅读