Cypher: очень медленное создание отношений (UNWIND) - PullRequest
0 голосов
/ 14 июля 2020

Я использую neo4j python API и подключаюсь к локальной базе данных. У меня есть граф, содержащий 700 000 узлов. Я могу очень быстро создать узлы, используя:

with session.begin_transaction() as tx: 
    cypher_query = 'UNWIND $batch as row ' \
    'CREATE (n:Node) ' \
    'SET n += row'
    tx.run(cypher_query, batch=batch)

График представляет 4M отношений, и я пытаюсь создать их следующим образом:

with session.begin_transaction() as tx: 
    cypher_query = 'UNWIND $batch as row ' \
    'MATCH (head:Node) WHERE head.id = row.head_id ' \
    'MATCH (tail:Node) WHERE tail.id = row.tail_id ' \
    'CREATE (head)-[rel:RELATIONSHIP]->(tail) ' \
    'SET rel += row.properties'
    tx.run(cypher_query, batch=batch)

Размер пакета 10К. Создание отношений происходит очень медленно. Я подсчитал, что это займет около 30 дней. Вы знаете обходной путь? Это нормально, если так медленно?

1 Ответ

0 голосов
/ 14 июля 2020

Я нашел хорошее решение. Выполните этот запрос в своей базе данных:

CREATE CONSTRAINT node_id ON (n:Node) ASSERT n.id IS UNIQUE

Это ускорит все. Идея заключается в следующем: если вы сопоставляете узел с помощью id, вы должны убедиться, что id уникален. В противном случае временная сложность запроса сильно возрастает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...