#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
» должно быть вверху, но я не думал, что смогу повторно включить его в запрос. Отлично работает.