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.

Neo4J Cypher – Borrar nodo existente si el archivo de origen Json ya no se encuentra.

Actualmente cargo un directorio de archivos JSON en mi base de datos de Neo4j cada día.

Si ya existe un ID de archivo en la base de datos, no hago nada. Si hay nuevos IDs de archivo, creo nuevos nodos. Si el ID del nombre de archivo ya no existe en el directorio, me gustaría eliminar el nodo con el ID correspondiente.

Con apoc.load.json, estoy utilizando failOnError: false para que el script no falle si alguno de los archivos ya no existe y, por lo tanto, no se puede cargar.

He intentado varios ejemplos para pasar el ID del archivo que falta, es decir, cuando ha devuelto un valor nulo, pero hasta ahora lo mejor que he encontrado es lo siguiente, que aún no elimina el nodo requerido ya que cuando se produce un error se pasa al siguiente archivo para cargar.
Esto es un fragmento, hay más código para la creación que se produce después de este punto:

UNWIND range(1,100) as id
WITH DISTINCT id + ".json" as file,id
CALL apoc.load.json("file:///output/"+file, null, {failOnError:false})
YIELD value
WITH value,id
CALL apoc.do.when(value is not null, "RETURN value",
"MATCH (n:File {FileId: id}) DETACH DELETE n", {value:value, id:id}) YIELD value as v
RETURN v

¿Existe alguna manera de capturar failOnError y procesar Cypher en ese punto para poder eliminar los nodos requeridos?

Consulta similar aquí:
https://github.com/neo4j-contrib/neo4j-apoc-procedures/issues/1149
También he intentado la combinación collect/coalesce para devolver algo en qué trabajar, pero esto tampoco funciona.

¡Gracias por cualquier ayuda!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de capturar el failOnError y procesar Cypher en ese punto para poder eliminar los nodos necesarios.

    Puedes usar el procedimiento apoc.load.jsonParams en lugar de apoc.load.json para capturar los errores y procesar Cypher en consecuencia. El procedimiento apoc.load.jsonParams tiene un parámetro adicional params que te permite pasar parámetros personalizados al procedimiento.

    Aquí tienes un ejemplo de cómo puedes modificar tu código para eliminar los nodos con IDs coincidentes que ya no están presentes en el directorio:

    CALL apoc.load.directory("file:///output/", null, {failOnError:false, recursive:true}) YIELD file
    WITH file, file.path as filePath
    WITH filePath, apoc.load.jsonParams(filePath, '', {failOnError:false}) as json, file
    WITH filePath, json, file
    CALL apoc.do.when(json is not null, 'RETURN json', 'MATCH (n:File {FileId: $fileId}) DETACH DELETE n', {fileId: file.name}, false) YIELD value
    RETURN value;
    

    En este código, usamos el procedimiento apoc.load.directory para cargar todos los archivos en el directorio y luego usamos el procedimiento apoc.load.jsonParams para cargar el contenido de cada archivo. Si el archivo no está presente, la variable json será null.

    Luego, usamos el procedimiento apoc.do.when para ejecutar condicionalmente código Cypher. Si json no es nulo, simplemente lo retornamos. Si es nulo, ejecutamos una consulta DELETE para eliminar el nodo que corresponde al archivo faltante.

    Usamos el parámetro $fileId para pasar el nombre del archivo a la consulta Cypher. Este parámetro hace referencia a la variable file.name que contiene el nombre del archivo actual.

    Este código debería permitirte eliminar los nodos con IDs coincidentes que ya no están presentes en el directorio.

    Espero que esto te ayude. Avísame si tienes alguna otra pregunta.

Comments are closed.