Здесь происходит пара вещей. Обратите внимание на ответ 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}) должен существовать.
Если вам действительно нужно понимание шаблона, следуйте советам киберсамов и убедитесь, что вы проверяете, является ли список, полученный в результате понимания, пустым или непустым.