7.4 Уникальность

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

Пример: поиск друзей друзей пользователя не должен возвращать самого пользователя.

Давайте создадим несколько узлов и связей:

CREATE (adam:User {name: 'Adam'}),(pernilla:User {name: 'Pernilla'}),(david:User {name: 'David'}),
  (adam)-[:FRIEND]->(pernilla),(pernilla)-[:FRIEND]->(david)

Это даст нам следующий граф:

Теперь поищем друзей друзей Адама (Adam):

MATCH (user:User {name: 'Adam'})-[r1:FRIEND]-()-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend
friend_of_a_friend
Node[2]{name:"David"}

В этом запросе Cypher решает не возвращать совпадения, когда связи образца r1 и r2 указывают на одну и ту же связь графа.

Однако могут быть случаи, когда такое поведение нежелательно. Если запрос должен вернуть пользователя, то имеется возможность распространить сопоставление на несколько предложений MATCH clauses, например, так:

MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)
WITH friend
MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend
friend_of_a_friend
Node[2]{name:"David"}
Node[0]{name:"Adam"}

Предыдущая | Следующая