Присвоить результат сопоставления второй переменной и выполнить фильтрацию

#neo4j #cypher

#neo4j #шифр

Вопрос:

Есть ли способ дублировать результаты запроса в другую переменную, а затем выполнить некоторую фильтрацию по второй переменной, чтобы потенциально возвращались два разных результата?

Я пытаюсь сначала сохранить путь к переменной, затем присвоить этот результат второй переменной, затем выполнить WHERE для этой второй переменной, возвращая результаты из исходного запроса (первая переменная)

 MATCH
    (a:Account {id : '3edcfba7-e95b-4d22-9793-e5f983ebde33'})
MATCH
    (target:Vertex { id : '59255ad6-0397-4b2d-9e69-6999131cea16'})
    <-[:PARENT*]-
    (a)
OPTIONAL MATCH
    p=
        (new_parent:Vertex {id : '3a63f643-f437-4415-b046-b324aa697f42'})
        <-[:PARENT*]-
        (a)
WITH
    p
    , target
    , p AS child
    WHERE
        NONE(x IN nodes(child) WHERE x = target)
RETURN
    p
    , target
    , child // this can return null
  

Ответ №1:

Вы можете использовать CASE предложение для генерации child переменной.

Например:

 MATCH
    (target:Vertex { id : '59255ad6-0397-4b2d-9e69-6999131cea16'})
    <-[:PARENT*]-
    (a:Account {id : '3edcfba7-e95b-4d22-9793-e5f983ebde33'})
OPTIONAL MATCH
    p=
        (new_parent:Vertex {id : '3a63f643-f437-4415-b046-b324aa697f42'})
        <-[:PARENT*]-
        (a)
RETURN
    p
    , target
    , CASE WHEN NONE(x IN NODES(p) WHERE x = target) THEN p END AS child
  

CASE Предложение будет сгенерировано NULL , если ни одно из WHEN предложений не применяется и ELSE предложения нет.