Использование нескольких переменных в ВЫЗОВЕ Neo4j{ С …}

#neo4j #cypher #graph-databases

Вопрос:

У меня есть несколько узлов со свойствами, которые я хотел бы преобразовать в отношения и свойства отношений. В идеале я хотел бы сделать многие из них сразу, используя UNWIND ["prop1", "prop2", ...] с CALL { WITH unwound_prop ...} , но у меня возникают проблемы при выполнении всей CALL структуры.

Например, если у меня есть пара узлов с некоторыми свойствами:

 create (n:person {name: "Tabitha", lunch: "salad", dinner:"steak"});
create (n:person {name: "Tony", lunch: "salad", dinner:"steak"});
create (n:person {name: "Sam", lunch: "spaghetti", dinner:"pizza"});
create (l:meal {name: "lunch"});
create (l:meal {name: "dinner"});
 

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

 match (n:person) with n
match (l:meal)
where l.name = "lunch"
and n.lunch IS NOT NULL
create (n)-[r:ATE {food:n.lunch}]->(l)
remove n.lunch;
 

Это перемещает свойство узла person в отношения, чего я и хочу.

Однако, если я захочу сделать это несколько раз CALL , то столкнусь с проблемой:

 unwind ["lunch", "dinner"] as sel_meal
call {
    with sel_meal
    match (n:person) with n
    match (l:meal)
    where l.name = sel_meal
    and n[sel_meal] IS NOT NULL
    create p=(n)-[r:ATE {food:n[sel_meal]}]->(l)
    return p as result
}
return resu<
 

ошибка:

 Neo.ClientError.Statement.SyntaxError: Variable `sel_meal` not defined (line 6, column 20 (offset: 130))
"    where l.name = sel_meal"
                    ^
 

Похоже, что использование WITH n для уменьшения количества person выбранных узлов переопределяет WITH sel_meal предложение, поэтому я не могу использовать переменную unwound. Есть ли способ включить и то, и другое? Лучший способ правильно выбрать эти узлы? Или лучший способ размотать несколько переменных сразу в отношения ( FOREACH здесь тоже не кажется очень полезным).

Ответ №1:

У вас есть промежуточное предложение WITH, в котором вы не включаете переменную sel_meal в область видимости:

 match (n:person) with n
 

Весь запрос будет выглядеть так:

 unwind ["lunch", "dinner"] as sel_meal
call {
    with sel_meal
    match (n:person) 
    with n, sel_meal
    match (l:meal)
    where l.name = sel_meal
    and n[sel_meal] IS NOT NULL
    create p=(n)-[r:ATE {food:n[sel_meal]}]->(l)
    return p as result
}
return resu<
 

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

1. Замечательно! Спасибо. Я знал WITH , что » для sel_meal » должно быть вверху, но я не думал, что смогу повторно включить его в запрос. Отлично работает.