10.1.4. Связи углублённо
10.1.4.1 Типы связей со специальными символами
Иногда ваша база данных будет иметь типы, содержащие неалфавитные символы или пробелы. используйте ` (косую кавычку) в качестве ограничителя.
Запрос
MATCH (n { name:'Rob Reiner' })-[r:`TYPE THAT HAS SPACE IN IT`]->() RETURN r
возвращает связь, тип которой содержит пробелы.
Таблица 10.10 Результат
r |
---|
:TYPE THAT HAS SPACE IN IT[8]{} |
10.1.4.2 Множественные связи
Связи могут быть выражены при помощи нескольких операторов вида ()--(), или же они могут быть вытянуты вместе, например:
Запрос
MATCH (charlie { name:'Charlie Sheen' })-[:ACTED_IN]->(movie)<-[:DIRECTED]->(director) RETURN charlie,movie,director
возвращает 3 узла на этом пути.
Таблица 10.11 Результат
charlie | movie | director |
---|---|---|
Node[1]{name:"Charlie Sheen"} | Node[4]{name:"WallStreet",title:"Wall Street"} | Node[0]{name:"Oliver Stone"} |
10.1.4.3 Связи переменной длины
Узлы с переменным числом рёбер «связь→узел» всегда можно найти с помощью следующего синтаксиса: -[:TYPE*minHops..maxHops]->. Здесь minHops и maxHops являются необязательными параметрами и по умолчанию принимаются от 1 до бесконечности. Если границы не указываются, точки можно опустить.
Запрос
MATCH (martin { name:"Martin Sheen" })-[:ACTED_IN*1..2]-(x) RETURN x
возвращает узлы, которые имеют одну или две связи, исходящих от Мартина (Martin).
Таблица 10.12 Результат
x |
---|
Node[4]{name:"WallStreet",title:"Wall Street"} |
Node[1]{name:"Charlie Sheen"} |
Node[6]{name:"Michael Douglas"} |
Node[3]{name:"TheAmericanPresident",title:"The American President"} |
Node[6]{name:"Michael Douglas"} |
10.1.4.4 Идентификатор связи в связях переменной длины
Если связь между двумя узлами переменной длины, идентификатор связи становится коллекцией связей.
Запрос
MATCH (actor { name:'Charlie Sheen' })-[r:ACTED_IN*2]-(co_actor) RETURN r
возвращает коллекцию связей.
Таблица 10.13 Результат
r |
---|
[:ACTED_IN[0]{},:ACTED_IN[1]{}]| |
[:ACTED_IN[0]{},:ACTED_IN[2]{}] |
10.1.4.5 Сопоставление со свойствами на пути переменной длины
Связь переменной длины с определенными на ней свойствами означает, что все связи в пути должны иметь набор свойств для заданного значения. В этом запросе имеется два пути между Charile Sheen и его отцом Martin Sheen.
Один включает “блокируемую” связь, а другой - нет. В этом случае мы сначала изменим исходный граф с помощью следующего запроса, который добавит блокируемую (“blocked”) и неблокируемую (“unblocked”) связи:
MATCH (charlie:Person { name:'Charlie Sheen' }),(martin:Person { name:'Martin Sheen' }) CREATE (charlie)-[:X { blocked:false }]->(:Unblocked)<-[:X { blocked:false }]-(martin) CREATE (charlie)-[:X { blocked:true }]->(:Blocked)<-[:X { blocked:false }]-(martin);
Это означает, что мы стартуем со следующего графа:
Запрос
MATCH p =(charlie:Person)-[* { blocked:false }]-(martin:Person) WHERE charlie.name = 'Charlie Sheen' AND martin.name = 'Martin Sheen' RETURN p
возвращает пути между Чарли и Мартином Шином, на которых все связи имеют свойство блокировки (blocked), установленное в значение FALSE.
Таблица 10.14 Результат
p |
---|
[Node[1]{name:"Charlie Sheen"},:X[12]{blocked:false},Node[9]{},:X[13]{blocked:false},Node[2]{name:"Martin Sheen"}] |