es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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”?

Tags:  , ,

Answer

  1. Avatar for 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 variables u y a ubicadas en la consulta externa optional match dentro de la consulta else de apoc.do.case.

    Desafortunadamente, no es posible reutilizar las variables u y a en la consulta else que se pasa a apoc.do.case. Esto se debe a que la consulta else se ejecuta solo si ninguno de los casos anteriores en apoc.do.case coincide con el patrón. Por lo tanto, la consulta else 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 de match único para comprobar si el Usuario existe y es administrador de la Cuenta. Esto simplificará la consulta y la hará más eficiente. Aquí está una versión mejorada de la consulta:

    match (u:User {id:$userId})-[:ACCOUNT_ADMIN]->(a:Account {id:$accountId})
    call apoc.do.case([
       {exists((a)-[:CONTAINS]->(:Project {name:$projectName}))},
       "return {error:'el nombre del proyecto ya existe en la cuenta'} as result",
       {accountId:$accountId, userId:$userId, projectName:$projectName},
       "create (a)-[:CONTAINS]->(:Project {name:$projectName})<-[:PROJECT_ADMIN]-(u) return {result:'proyecto creado'} as result"
    ])
    yield value
    return value.result as result
    

    En esta versión, utilizamos un único patrón de match para localizar los nodos de Usuario y Cuenta y comprobar si el Usuario es un administrador de la Cuenta. Luego, utilizamos apoc.do.case para verificar si ya existe un proyecto con el nombre dado en la Cuenta. 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.

Comments are closed.