在这个查询中,我想检查$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.case
的else
查询中,我必须执行另一个match
来重新定位我已经位于外部optional matches
中的节点。
是否没有办法重用我已经在apoc.do.case
else
查询中的optional match
中找到的u
和a
变量?
你试过这个吗?除了参数之外,我认为你应该使用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