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"} |