Условие запроса Cypher всегда возвращает true - PullRequest
0 голосов
/ 26 июня 2018
MATCH (c:OBJ {dummy:false})
where [{param} is null or [(c)-[]->(p:PRO {dummy:false}) WHERE p.val ={param} | true ] ]
return c

У меня большой запрос, из которого есть эта простая часть. Но

[{param} is null or [(c)-[]->(p:PRO {dummy:false}) WHERE  p.val = {param} | true] ]

part всегда возвращает true, даже если p.val ={param} false. Что я тут не так сделал? Синтаксис выглядит хорошо для меня.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Здесь происходит пара вещей. Обратите внимание на ответ cybersam, так как он относится к пониманию шаблонов внутри.

Однако большая проблема в том, что предложение WHERE в конечном итоге будет оценивать список, а НЕ логическое значение!

Используя квадратные скобки для всего вашего предложения WHERE, это означает, что вы создаете список, и его содержимое будет тем, что находится внутри. Вещи внутри будут иметь булево значение, так что есть две возможности, как это получится:

WHERE [true]

или

WHERE [false]

и в любом из этих случаев это НЕ логические значения, а одноэлементные списки, где единственным элементом в списке является логическое значение!

Использование WHERE в таком списке ВСЕГДА оценивает как true. Неважно, что в списке. Независимо от того, сколько элементов в списке. Неважно, если список пуст. Если сам список существует, он будет оценен как true, и предложение WHERE выполнится успешно.

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

MATCH (c:OBJ {dummy:false})
WHERE ( {param} is null or (c)-->(:PRO {dummy:false, val:{param}}) )
RETURN c

В приведенном выше примере скобки, используемые при использовании предложения WHERE, на самом деле не нужны, но вы можете использовать их, если хотите.

Это также должно быть лучшим способом выражения предиката, который вы хотите. В этом случае нам не нужно понимание шаблона вообще. Достаточно сказать, что либо параметр {param} должен быть нулевым, либо этот шаблон (где одним из свойств является параметр {param}) должен существовать.

Если вам действительно нужно понимание шаблона, следуйте советам киберсамов и убедитесь, что вы проверяете, является ли список, полученный в результате понимания, пустым или непустым.

0 голосов
/ 26 июня 2018

A понимание шаблона всегда возвращает список, даже если он пустой.

Таким образом, следующее никогда не будет равно false или NULL:

[(c)-[]->(p:PRO {dummy:false}) WHERE  p.val = {param} | true]

Этот запрос (который проверяет размер результата внутреннего понимания), вероятно, будет работать для вас:

MATCH (c:OBJ {dummy:false})
WHERE [$param IS NULL or SIZE([(c)-->(p:PRO {dummy:false}) WHERE p.val = $param | true]) > 0 ]
RETURN c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...