py2neo MERGE вызывает ConstraintValidationFailed Узел уже существует при распараллеливании - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь распараллелить запрос на создание графа, используя 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.

...