ДОПОЛНИТЕЛЬНОЕ МАТЧ и ГДЕ не работают вместе - PullRequest
0 голосов
/ 09 июня 2019

возьмите следующий запрос:

MATCH (p: Post)-[r]->(reply: Post) 
OPTIONAL MATCH (profile:Profile)-[r2:Likes]->(reply) 
WHERE p.key = $postKey
RETURN reply, collect(profile.key) 

Намерение состоит в том, чтобы вернуть все ответы на данный пост и сказать вам, кому они нравятся, если кому-то они понравились.Второе совпадение не является обязательным, потому что вы все равно должны возвращать все ответы, которые вам не понравились.Вместо этого возвращается период ответов.Следующий запрос работает:

MATCH (p: Post {key:$postKey})-[r]->(reply: Post) 
OPTIONAL MATCH (profile:Profile)-[r2:Likes]->(reply)  
RETURN reply, collect(profile.key)

Теперь я понимаю это до такой степени, что запросы Cypher выполняются последовательно, а не обрабатываются, а затем выполняются в целом.Таким образом, во втором примере он получает только ответы на данный пост, затем получает лайки, а затем возвращает, тогда как в первом примере он сначала получает все ответы, затем получает все лайки, а затем должен их отфильтровать.У меня следующие вопросы:

  1. Почему они не фильтруются?Я предполагаю, что необязательное совпадение приводит к тому, что сообщение больше не будет в наборе данных, поэтому фильтр игнорируется.

  2. Есть ли способ использовать, где и этого не произошло?

  3. И, наконец, учитывая, что это действительно приводит к тому, что вы должны использовать последовательный характер для поиска ключей или его следует избегать по соображениям производительности?

1 Ответ

0 голосов
/ 10 июня 2019

Корень этого недоразумения в том, что WHERE не является отдельным предложением, оно изменяет предыдущее предложение MATCH, OPTIONAL MATCH или WITH.

Это поможет прочитать их как пару ...

MATCH ... WHERE ...

WITH ... WHERE ...

OPTIONAL MATCH ... WHERE ...

Поведение OPTIONAL MATCH заключается в том, что результаты не будут отфильтрованы. Вместо этого, если OPTIONAL MATCH терпит неудачу (и это включает результат его парного предложения WHERE), вновь введенные переменные в шаблоне OPTIONAL MATCH возвращаются как нуль.

Итак, с этой информацией вы можете видеть, что ваше предложение WHERE на самом деле не в том месте. Он связан с ДОПОЛНИТЕЛЬНЫМ МАТЧОМ, когда вместо этого следует следовать МАТЧУ, ограничивая эти результаты (и разрешая поиск по индексу, если у вас есть индекс: Post (ключ)).

Еще одно средство, которое вы можете использовать для исправления (менее корректно в данном конкретном случае, но полезно в других случаях), - это следовать ФАКУЛЬТАТИВНОМУ МАТЧУ с WITH ... WHERE ..., что позволит предложению WHERE отфильтровывать результаты.

Подробнее об этом можно прочитать в одной из наших статей базы знаний Neo4j .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...