#filter #neo4j #match #cypher
#Фильтр #neo4j #совпадение #шифр
Вопрос:
Мне интересно, почему эти два запроса дают мне разные результаты.
START keanu=node(1)
MATCH keanu -[r:ACTED_IN]-> (movieToDelete)
OPTIONAL MATCH movieToDelete -[relationshipsToDelete]- ()
WHERE "Neo" IN r.roles
RETURN movieToDelete, relationshipsToDelete;
И
START keanu=node(1)
MATCH keanu -[r:ACTED_IN]-> (movieToDelete)
WHERE "Neo" IN r.roles
OPTIONAL MATCH movieToDelete -[relationshipsToDelete]- ()
RETURN movieToDelete, relationshipsToDelete;
В первом запросе я фильтрую Neo после необязательного совпадения, а во втором я фильтрую Neo перед необязательным совпадением. Первый запрос фактически возвращает строку, в которой r-переменная не имеет Neo в ролях. Однако существует r-переменная, и она содержит свойство, называемое ролями.
Ответ №1:
ГДЕ всегда является частью предыдущего (НЕОБЯЗАТЕЛЬНОГО) предложения СООТВЕТСТВИЯ.
из документов:
В случае нескольких (НЕОБЯЗАТЕЛЬНЫХ) предложений СООТВЕТСТВИЯ предикат в WHERE всегда является частью шаблонов в непосредственно предшествующем совпадении. Как результаты, так и производительность могут пострадать, если WHERE помещен в неправильное предложение MATCH.
http://docs.neo4j.org/chunked/stable/query-where.html
РЕДАКТИРОВАТЬ: если вы попробуете это на примере данных фильма в браузере neo4j, а затем измените результат на табличный вид, может быть понятнее, что на самом деле возвращает запрос cypher:
Первый запрос возьмет Киану, все фильмы, в которых он играл, необязательно сопоставит другие отношения и отфильтрует эти необязательно совпадающие отношения (фильмы Киану фильтроваться не будут)
Второй запрос возьмет Киану, сопоставит все его фильмы с ролью Нео, и для этого отфильтрованного набора фильмов он выполнит необязательное сопоставление
Итак, результат первого запроса содержит то же, что и второй, плюс фильмы, в которых Киану играет, но не в роли Нео
Комментарии:
1. Спасибо, но это не объясняет, почему первый запрос возвращает строку, в которой r-переменная не равна нулю, а r-переменная присутствует, но не содержит «Neo».
2. Потому что «где» ограничивает только необязательное совпадение, а не первое совпадение.
3. То есть вы имеете в виду, что, поскольку r-переменная даже не включена в необязательное соответствие, фильтр вообще не должен влиять? потому что это так..