Pasar variable a la consulta utilizada en el procedimiento apoc.do.case de Neo4j.
En esta consulta, quiero verificar la validez de los parámetros $accountId
y $userId
, y si son válidos, crear un nuevo proyecto vinculado a los nodos Usuario y Cuenta.
coincidencia opcional (u:User {id:$userId})
coincidencia opcional (a:Account {id:$accountId})
llamar a apoc.do.case([
no existe((u)-[:ACCOUNT_ADMIN]->(a)),
"return {error:'el usuario no es administrador de la cuenta especificada'} como resultado",
"coincidencia (u:User {id:$userId})-[:ACCOUNT_ADMIN]->(a:Account {id:$accountId})
crear (a)-[:CONTAINS]->(:Project {name:$projectName})<-[:PROJECT_ADMIN]-(u)
return {result:'proyecto creado'} como resultado",
{accountId:$accountId, userId:$userId, projectName:$projectName}
)
aporte de valor
retorno value.result como resultado
Parece que funciona, pero no me parece muy elegante. Lo que me molesta especialmente es que en la consulta “else” pasada a “apoc.do.case” tengo que ejecutar otra coincidencia para reubicar los nodos que ya he ubicado en las coincidencias opcionales externas.
¿No hay forma de reutilizar las variables “u” y “a” que ya he ubicado en las coincidencias opcionales dentro de la consulta “else” de “apoc.do.case”?
davy.ai
La consulta proporcionada parece estar comprobando la validez de los parámetros
$accountId
y$userId
, y si son válidos, entonces se crea un nuevo proyecto vinculado a los nodos de Usuario y Cuenta. Sin embargo, el autor de la consulta considera que no es elegante y quiere saber si hay una forma de reutilizar las variablesu
ya
ubicadas en la consulta externaoptional match
dentro de la consultaelse
deapoc.do.case
.Desafortunadamente, no es posible reutilizar las variables
u
ya
en la consultaelse
que se pasa aapoc.do.case
. Esto se debe a que la consultaelse
se ejecuta solo si ninguno de los casos anteriores enapoc.do.case
coincide con el patrón. Por lo tanto, la consultaelse
debe estar autocontenida y volver a ubicar los nodos.Sin embargo, hay algunas mejoras que se pueden hacer en la consulta. En lugar de usar dos
optional match
separados, podemos usar un patrón dematch
único para comprobar si elUsuario
existe y es administrador de laCuenta
. Esto simplificará la consulta y la hará más eficiente. Aquí está una versión mejorada de la consulta:En esta versión, utilizamos un único patrón de
match
para localizar los nodos deUsuario
yCuenta
y comprobar si elUsuario
es un administrador de laCuenta
. Luego, utilizamosapoc.do.case
para verificar si ya existe un proyecto con el nombre dado en laCuenta
. Si existe, devolvemos un error. Si no existe, creamos el nuevo proyecto y devolvemos un mensaje de éxito.Esta versión de la consulta es más eficiente y más fácil de leer que la versión original. También evita la necesidad de usar
optional match
, que pueden ser lentos en algunos casos.