Улучшение запросов на шифрование и исключение декартового произведения - PullRequest
0 голосов
/ 05 июня 2018

Я довольно новичок в neo4j и cypher.У меня есть таблица Transaction и таблица Person, которую я хотел бы связать следующим образом (в конечном итоге имеет значение только отношение rel3):

MATCH (t:Transaction),(p1:Person)
WHERE p1.id = t.id1
CREATE (p1)-[:rel1]->(t)

MATCH (t:Transaction),(p2:Person)
WHERE p2.id = t.id2
CREATE (t)-[:rel2]->(p2)

MATCH (p1:Person)-[:rel1]->(t:Transaction)-[:rel2]->(p2:Person)
CREATE (p1)-[:rel3]->(p2)

Однако мне было интересно, есть ли способизбежать этого двойного декартова произведения и все же достичь той же цели.Производительность действительно очень важна для меня, так как я обработал миллионы строк.Поэтому я попробовал несколько модификаций и в итоге получил эту версию:

MATCH (t:Transaction)
WITH t
MATCH (p1:Person {id : t.id1})
WITH n1, t
MATCH (p2:Person {id : t.id2})
CREATE (p1)-[:rel3]->(p2)

Проще читать и понимать, но по команде PROFILE делает то же самое.Есть идеи улучшить этот код?

1 Ответ

0 голосов
/ 05 июня 2018

Интересно, почему вы делаете это в два шага, если вы можете сделать

MATCH (t:Transaction),(p1:Person),(p2:Person)
WHERE p1.id = t.id1
AND p2.id = t.id2
CREATE (p1)-[:REL3]->(p2)

Если у вас есть уникальное ограничение на свойство id для метки Person, это примерно так же быстро, как вы получитеэтот.Однако мой самый большой вопрос ... почему бы вам не создать отношения в тот момент, когда вы создаете саму транзакцию, вместо того, чтобы хранить внешние ключи (большое нет, нет в базе данных графа), а затем выполнять работу впоследствии??

Надеюсь, это поможет.

С уважением, Том

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