Neo4j: implementando la eliminación suave con relaciones opcionales
Estoy tratando de implementar una eliminación suave en Neo4j. La gráfica descrita en Cypher desde el punto de vista de Alicia es como tal:
(clyde:User)<-[:FOLLOWS]-(alice:User)-[:LIKES]->(bob:User)
En lugar de eliminar realmente un nodo y sus relaciones, estoy
cambiar su etiqueta para que ya no se pueda consultar directamente, es decir, soltar suUser
etiquetar y agregar un_User
etiqueta (note el guión bajo)reemplazando sus relaciones para que no pueda ser alcanzado por mis consultas normales, por ejemplo, borrando su:FOLLOWS
relaciones y reemplazarlo con:_FOLLOWS
relacionesEntonces, esto es básicamente el equivalente a mover una fila a una tabla de archivo en una base de datos relacional. Pensé que este es un enfoque bastante eficiente porque efectivamente nunca estás visitando las partes del gráfico que se han borrado automáticamente. Además, no tiene que modificar ninguna de sus consultas existentes.
El resultado de la eliminación suave de Alice debería ser este:
(clyde:User)<-[:_FOLLOWS]-(alice:_User)-[:_LIKES]->(bob:User)
Mi primer intento en la consulta fue este:
match (user:User {Id: 1})
optional match (user)-[follows:FOLLOWS]->(subject)
remove user:User set user:_User
delete follows
create (user)-[:_FOLLOWS]->(subject);
El problema es que cuando este usuario no sigue a nadie, la consulta intenta crear una relación entreuser
ynull
Porque la segunda coincidencia es opcional, entonces me da este error:Other node is null.
Mi segundo intento fue este:
match (user:User {Id: 1})
remove user:User set user:_User
optional match (user)-[follows:FOLLOWS]->(subject)
foreach (f in filter(f in collect({r: follows, n: subject}) where f.r is not null) | delete f.r create (user)-[:_FOLLOWS]->(f.n));
Así que estoy poniendo la relación y el sujeto en un mapa, recogiendo estos mapas en una colección, tirando cada mapa "vacío" y haciendo un bucle sobre la colección. Pero esta consulta me da este error:
SyntaxException: Invalid input '.': expected an identifier character, node labels, a property map, whitespace or ')' (line 1, column 238)
¿Alguien sabe como puedo arreglar esto?
Gracias jan