Как работает Neo4J cypher OPTIONAL MATCH? - PullRequest
0 голосов
/ 07 апреля 2020

Я столкнулся с проблемой сегодня, понимая предложение OPTIONAL MATCH в cypher. Давайте рассмотрим этот простой случай:

CREATE (:a {type:"group"})-[:a_rel]->(:a {type: "app"})-[:b_rel]->(:b);

Это создаст 2 узла "a" с другим атрибутом типа, плюс один узел "b". Все они находятся в простом пути a -> a -> b

Затем я пытаюсь сопоставить узел "a", имеющий тип "group", связанный с другим узлом "a" Возможно, подключен к узлу "b".

Итак, если я выполню следующий запрос, я ожидаю, что он ничего не выдаст:

MATCH(x:a)-->(y:a) 
where x.type = "group" 
OPTIONAL MATCH (y)-->(z:b) 
where z IS NULL 
return y

, но он всегда возвращает второе "a" узел пути, используя IS NULL или IS NOT NULL в предложении where.

Не могли бы вы объяснить, что я не понимаю здесь. В моей реальной модели второй узел «а» может быть подключен или нет к узлу «б». Я хотел бы получить все те, которые не подключены к какому-либо узлу "b".

Большое спасибо за вашу помощь

Rémi

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Что делает OPTIONAL MATCH, так это пытается найти шаблоны в графе. Если найден соответствующий шаблон, возвращается Node, иначе он заменяется на NULL. Надеюсь, это устранит возникшую путаницу.

0 голосов
/ 07 апреля 2020

Пока предложение MATCH находит совпадение, запрос всегда будет возвращать y.

Это потому, что OPTIONAL MATCH не должно совпадать с чем-либо в заказ для продолжения запроса. Вот почему это «ДОПОЛНИТЕЛЬНО».

Это один из способов сделать то, что вы хотели:

MATCH (x:a)-->(y:a)
WHERE x.type = "group" AND NOT (y)-->(:b)
RETURN y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...