Как удалить и добавить отношения в одном запросе neo4j? - PullRequest
1 голос
/ 02 апреля 2019

Мне нужен совет для добавления и удаления отношений на одном и том же узле во время одного и того же запроса (тот же сценарий шифрования).

Допустим, у нас есть :User, у которого есть несколько отношений с узлом:Page.Я хочу добавить отсутствующие отношения из массива ['toto', 'titi', 'tete'], и я также хотел бы удалить отношения, уже присутствующие в БД, но не присутствующие в массиве.

MATCH (u:User {username: "carere"}), (pages:Page) WHERE pages.title IN ['toto', 'titi', 'tete']
WITH u, pages
MERGE (u)-[:WROTE]->(pages)
WITH u, pages
MATCH (u)-[r:WROTE]->(p) WHERE NOT p.title IN ['toto', 'titi', 'tete']
DELETE r
RETURN u, r, pages

Запрос работает, но я хотел бызнаете, если я должен разделить это утверждение в 2 запроса или если я останусь с моим единственным запросом, в любом случае, какое решение является лучшим для достижения того, что я пытаюсь сделать?

Спасибо за ваше время, хорошего дня:)

1 Ответ

0 голосов
/ 04 апреля 2019

Вы можете хранить все, что вам нужно, в одном запросе, поскольку он дает желаемый результат. Лучший способ работы с вашими данными зависит от схемы и количества данных в вашей базе данных. Взгляните на Настройка запросов , которая включает план выполнения и профилирование.

Например, на минимальном наборе данных после профилирования вашего запроса я получил сводку

Cypher version: CYPHER 3.5, planner: COST, runtime: INTERPRETED. 76 total db hits in 11 ms.

В том же наборе данных я попробовал модифицированный запрос

profile 
MATCH (u:User {username: "carere"})-[r:WROTE]->(:Page) DELETE r
WITH u MATCH (pages:Page) WHERE pages.title IN ['toto', 'titi', 'tete']
MERGE (u)-[r:WROTE]->(pages)
RETURN u, r, pages

со сводкой

Cypher version: CYPHER 3.5, planner: COST, runtime: INTERPRETED. 70 total db hits in 9 ms.

Но если мы расширим наш набор данных дополнительными независимыми узлами с запросом

UNWIND range(0, 100) as entityId
CREATE (: User {username: "user" + entityId})-[:WROTE]->(: Page {title: "title" + entityId})

тогда резюме профилирования будет выглядеть немного иначе

# first query
Cypher version: CYPHER 3.5, planner: COST, runtime: INTERPRETED. 1562 total db hits in 52 ms.

#modified query
Cypher version: CYPHER 3.5, planner: COST, runtime: INTERPRETED. 676 total db hits in 19 ms.

И с этой информацией вы можете начать играть с индексами и настройкой схемы

Надеюсь, это будет полезно.

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