10.3.3 Использование образцов в WHERE

10.3.3.1 Фильтр на образцах

Образцы представляют собой выражения в Cypher, выражения, которые возвращают коллекцию путей. Выражения коллекции есть также предикаты – пустая коллекция представляет ложь (false), а непустая – истину (true).

Таким образом, образцы есть не только выражения, они также и предикаты. Единственное ограничение на ваш образец состоит в том, что он должен быть выражен через единственный путь. Вы не можете использовать запятые между несколькими путями, подобно тому, как это делается в MATCH. Вы можете добиться того же эффекта, комбинируя несколько образцов с помощью AND.

Отметим, что вы не можете вводить здесь новые идентификаторы. Хотя это может выглядеть очень похоже на образцы MATCH, предложение WHERE – это всё об устранении соответствующих подграфов. MATCH (a)-[*]->(b) совсем не то, что WHERE (a)-[*]->(b); первое будет производить подграф для каждого пути, который будет найден между a и b, а последнее будет исключать любой соответствующий подграф, для которого a и b не имеют между собой звена направленной связи.

Запрос

MATCH (tobias { name: 'Tobias' }),(others)
WHERE others.name IN ['Andres', 'Peter'] AND (tobias)<--(others)
RETURN others

вернёт узлы, которые имеют исходящую связь к узлу "Tobias".

Таблица 10.30 Результат

others
Node[2]{name:"Andres",age:36,belt:"white"}

10.3.3.2 Фильтры на образцах, использующие NOT

Функция NOT может быть использована для исключения образца.

Запрос

MATCH (persons),(peter { name: 'Peter' })
WHERE NOT (persons)-->(peter)
RETURN persons

возвращает узлы, которые не имеют исходящей связи к узлу "Peter".

Таблица 10.31 Результат

persons
Node[0]{name:"Tobias",age:25}
Node[1]{name:"Peter",age:34}

10.3.3.3 Фильтр на образце со свойствами

Вы можете также добавлять свойства к вашему образцу:

Запрос

MATCH (n)
WHERE (n)-[:KNOWS]-({ name:'Tobias' })
RETURN n

находит все узлы, которые имеют связь KNOWS к узлу с именем Tobias.

Таблица 10.32 Результат

n
Node[2]{name:"Andres",age:36,belt:"white"}

10.3.3.4 Фильтрация по типу связи

Вы можете поместить точный тип связи в образец MATCH, но иногда вам захочется выполнить более продвинутую фильтрацию по типу. Вы можете использовать специальное свойство TYPE для сравнения типа с чем-нибудь ещё. В данном примере запрос выполняет сравнение на основе регулярного выражения с именем типа связи.

Запрос

MATCH (n)-[r]->()
WHERE n.name='Andres' AND type(r)=~ 'K.*'
RETURN r

возвращает связи, которые имеют тип, чьё имя начинается с «K».

Таблица 10.32 Результат

r
:KNOWS[0]{}
:KNOWS[1]{}

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