Neo4j шифровальный язык запросов - порядок операций для логических выражений

Я пытаюсь написать запрос для извлечения данных из моей базы данных Neo4J. Допустим, есть пять условий, которые определяют, хочу ли я извлечь _____ из моей базы данных: A, B, C, D и E. Булево выражение, которое определяет это:

A && B && (C || D || E)

По поиску в Интернете я не могу найти никакой информации о порядке операций, которые выполняются в запросах Neo4J И и ИЛИ (И обычно предшествует ИЛИ), но из моих наблюдений кажется, что они выполняются последовательно. Поскольку я не знаю, как явно определить порядок, то есть использовать круглые скобки, как можно реализовать запрос Cypher для удовлетворения булева выражения выше?

2 ответа

нет никакого способа, которым я знаю, чтобы явно определить порядок, иначе используя круглые скобки

Не будь так уверен.;)

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

MATCH (n) RETURN CASE WHEN false AND true OR true THEN 'and' ELSE 'or' END

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

Это должно быть эквивалентно либо ((false and true) or true) или же (false and (true or true)), но у них разные результаты.

(false and true) or true => false or true => true
false and (true or true) => false and true => false

Приведенный выше запрос вернет "и" в первом случае и "или" во втором, чтобы показать вам, что было выполнено первым. Возвращает "и", потому что они сгруппированы последовательно.

MATCH (n) RETURN CASE WHEN ((false AND true) OR true) THEN 'and' ELSE 'or' END

Это также возвращает "и", потому что это подразумеваемая группировка, которую вы получаете, когда выполняете логические операторы последовательно.

MATCH (n) RETURN CASE WHEN (false AND (true OR true)) THEN 'and' ELSE 'or' END

Но это возвращает "или".

Это был действительно многословный способ сказать, что добавление скобок - это действительно ответ.


Ради интереса я попытался определить приоритет, и похоже, что у Нео есть и приоритет:

MATCH (n) RETURN CASE WHEN true or true and false THEN 'and' ELSE 'or' END

Если или сгруппированы в первую очередь:

(true or true) and false => true and false => false

Если и сгруппированы в первую очередь:

true or (true and false) => true or false => true

Приведенный выше запрос возвращает 'и', указывая неявно сгруппированную конструкцию, которая в целом оценивается как true (таким образом, и была сгруппирована первой, несмотря на то, что появлялась последней последовательно).

Проект openCypher определяет грамматику для Cypher. Эта грамматика указывает, что порядок старшинства (от высшего к низшему) операторов в Cypher будет следующим:

  • IN,STARTS WITH,ENDS WITH,CONTAINS,=~,IS NULL,IS NOT NULL: бинарный список и сопоставление строк с проверкой нулей
  • , : унарное тождество и отрицание
  • ^: двоичная мощность
  • *,/,%: двоичное умножение и деление
  • +,-: бинарные операции сложения, конкатенации и вычитания
  • =,<>,<,>,<=,>=: операторы бинарного сравнения
  • NOT: унарное логическое НЕ
  • AND: двоичное логическое И
  • XOR: двоичное логическое исключающее ИЛИ
  • OR: двоичное логическое ИЛИ
Другие вопросы по тегам