使用多个变量在Neo4j CALL{WITH ..}



我有许多具有属性的节点,我想将它们转换为关系和关系属性。理想情况下,我希望使用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;

最新更新