10.2. Необязательное сопоставление
- 10.2.1 Введение
- 10.2.2 Связь
- 10.2.3 Свойства на необязательных элементах
- 10.2.4 Необязательные типизированные и именованные связи
10.2.1 Введение
OPTIONAL MATCH сопоставляет образцы вашей графовой базе данных точно так же, как это делает MATCH. Разница состоит в том, что если совпадений не найдено, OPTIONAL MATCH будет использовать NULL-значения для отсутствующих частей образца. OPTIONAL MATCH следует рассматривать как эквивалент Cypher для внешнего соединения в SQL.
Либо весь образец совпадает, либо ничего. Помните, что WHERE является частью описания образца, и предикаты будут учитываться при поиске совпадений, а не после него. Это особенно актуально в случае нескольких предложений (OPTIONAL) MATCH, когда критично поместить WHERE вместе с MATCH, которому он соответствует.
Совет
Для лучшего понимания образцов, используемых в предложении OPTIONAL MATCH, прочитайте раздел 8.5 “Образцы”.
Следующий граф используется для последующих примеров:
Рис. 10.2 Граф
10.2.2 Связи
Если связь необязательная, используйте предложение OPTIONAL MATCH. Оно подобно тому, как работает внешнее соединение в SQL. Если связь имеется, она возвращается. Если – нет, вместо неё возвращается NULL.
Запрос
MATCH (a:Movie { title: 'Wall Street' }) OPTIONAL MATCH (a)-->(x) RETURN x
возвращает NULL, поскольку узел не имеет исходящих связей.
Таблица 10.20 Результат
x |
---|
<null> |
10.2.3 Свойства на необязательных элементах
Возвращение свойства из необязательного элемента, который есть NULL, также даст NULL.
Запрос
MATCH (a:Movie { title: 'Wall Street' }) OPTIONAL MATCH (a)-->(x) RETURN x, x.name
возвращает элемент x (NULL в этом запросе), и NULL в качестве его имени.
Таблица 10.21 Результат
x | x.name |
---|---|
<null> | <null> |
10.2.4 Необязательные типизированные и именованные связи
Так же, как и с обычной связью, вы можете решить, какой идентификатор будет на нее указывать, и какой тип связи вам нужен.
Запрос
MATCH (a:Movie { title: 'Wall Street' }) OPTIONAL MATCH (a)-[r:ACTS_IN]->() RETURN r
возвращает узел, и NULL, поскольку узел не имеет исходящих связей ACTS_IN.
Таблица 10.22 Результат
r |
---|
<null> |