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