У меня очень длинный запрос на шифрование, использующий объединение, однако есть некоторые общие утверждения (выделены жирным шрифтом), которые повторяются в обоих запросах. Есть ли способ, которым я могу выделить или даже сохранить результирующий набор общих операторов, чтобы потом их разветвить и объединить? Я исследовал использование с, собирать и необязательное совпадение, но безрезультатно.
МАТЧ (s: Тема), (p: Программа)
ГДЕ s.name в ['A', 'B', 'C']
WITH собирать (-ять) как подпрограммы, p
WITH p, подпункты, РАЗМЕР (FILTER (c в подпрограммах WHERE c.level = "CSEC")) как csecs, SIZE (FILTER (c в подпрограммах WHERE c. уровень = "МЫС")) как накидки
ГДЕ p.csec_passes <= csecs И p.cape_passes <= capes <BR>
MATCH (p: Программа) - [: требуется] -> (s: Тема)
С p, sub, COLLECT (s) как мандаторы WHERE ALL (n в мандаториях WHERE n IN сабвуферов) И НЕ (p) -> (: Combo)
ВОЗВРАТ р
UNION
МАТЧ (s: Тема), (p: Программа)
ГДЕ s.name в ['A', 'B', 'C']
WITH collect (s) как подпрограммы, p
WITH p, subs, РАЗМЕР (FILTER (c в подпрограммах WHERE c.level = "CSEC")) как csecs, SIZE (FILTER (c в подпрограммах WHERE c. уровень = "МЫС")) как накидки
ГДЕ p.csec_passes <= csecs И p.cape_passes <= capes <BR>
MATCH (p: Программа) - [: требуется] -> (s: Тема)
С p, sub, COLLECT (s) в качестве мандаторий WHERE ALL (n в мандатах, где n в sub)
MATCH (p) - [: требуется] -> (c: комбинированный) - [: содержит] -> (s: Тема)
WITH p, c, subs, сбор (ы) в виде списка
WITH p, subs, собирать ({amt: c.amt, set: list}) как комбинации
WHERE ALL (комбо в комбинации, где combo.amt <= размер (apoc.coll.intersection (subs, combo.set)))
ВОЗВРАТ р </p>
Некоторый дополнительный контекст; все программные узлы подключены как минимум к одному предметному узлу, который называется обязательным. Кроме того, некоторые программные узлы также связаны с одним или несколькими комбинированными узлами. В таких случаях нужно проводить больше проверок программ, я объединяю запросы для обоих типов, комбинированные и некомбинированные.