我有许多具有属性的节点,我想将它们转换为关系和关系属性。理想情况下,我希望使用UNWIND ["prop1", "prop2", ...]
和CALL { WITH unwound_prop ...}
同时执行许多这些操作,但是在执行整个CALL
结构时,我遇到了麻烦。
例如,如果我有几个具有一些属性的people节点:
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 result;
错误:
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
子句,所以我不能使用未展开的变量。有没有办法把两者都包括进去?一种更好的方式来正确选择这些节点?或者是一种更好的方式来一次将多个变量展开成关系(FOREACH
在这里似乎也不是很有用)。
中间有一个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 result;