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 Результат

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

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