Как работает оператор IN в NEO4J, когда первый оператор является списком

#neo4j #cypher

#neo4j #cypher

Вопрос:

Я использую что-то подобное в запросе NEO4J

return [1] in [3,25,6,2,4,1]

и возвращает true .

Однако, когда я выполняю что-то вроде

return [1,2] in [3,25,6,2,4,1]

он возвращает false .

Итак, вопрос в том, как указывается для работы с оператором IN в списках. Я не смог найти никаких спецификаций по этому вопросу, и я не уверен, соответствует ли он всем версиям.

Комментарии:

1. В версии 3.0.3 это return [1] in [3,25,6,2,4,1] возвращает false .

Ответ №1:

Если это когда-либо работало, я почти уверен, что это ошибка (хотя я все еще ищу проблему с github). Поведение, которое вы ищете, должно быть достигнуто с помощью ALL .

 RETURN ALL(x IN [1, 2] WHERE x IN [3, 25, 6, 2, 4, 1])
  

Коллекции ( neo4j списки) не являются наборами, они могут иметь повторяющиеся записи, поэтому IN следует ожидать выполнения проверки принадлежности, а не пересечения. Операции Set в настоящее время отнесены к apoc или другим внешним процедурам.

Однако, если ваш первый операнд представляет собой список, он проверит, соответствует ли весь этот список какому-либо отдельному элементу во втором операнде. Так, например, [1, 2] IN [[1, 2], [3, 4]] вернет true , но [1, 2] IN [1, 2, 3, 4] вернет `false .