将变量传递给Neo4j apoc.do.case过程中使用的查询



在这个查询中,我想检查$accountId$userId参数的有效性,如果它们有效,那么创建一个附加到用户和帐户节点的新项目。

optional match (u:User {id:$userId})
optional match (a:Account {id:$accountId})
call apoc.do.case([
not exists((u)-[:ACCOUNT_ADMIN]->(a)),
"return {error:'user is not admin of the specified account'} as result",
"match (u:User {id:$userId})-[:ACCOUNT_ADMIN]->(a:Account {id:$accountId})
create (a)-[:CONTAINS]->(:Project {name:$projectName})<-[:PROJECT_ADMIN]-(u)
return {result:'project created'} as result",
{accountId:$accountId, userId:$userId, projectName:$projectName}
)
yield value
return value.result as result

它看起来很管用,但我觉得它不太优雅。特别令人厌烦的是,在传递给apoc.do.caseelse查询中,我必须执行另一个match来重新定位我已经位于外部optional matches中的节点。

是否没有办法重用我已经在apoc.do.caseelse查询中的optional match中找到的ua变量?

你试过这个吗?除了参数之外,我认为你应该使用apoc.do.when

optional match (u:User {id:$userId})
optional match (a:Account {id:$accountId})
call apoc.do.when(
not exists((u)-[:ACCOUNT_ADMIN]->(a)),
"return {error:'user is not admin of the specified account'} as result",
"with $a  AS a,$u AS u create (a)-[:CONTAINS]->(:Project {name:$projectName})<-[:PROJECT_ADMIN]-(u) return {result:'project created'} as result",
{u:u,a:a, projectName:$projectName}
)
yield value
return value.result as result

最新更新