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]{} |