Neo4j: implementando delete soft com relacionamentos opcionais
Estou tentando implementar uma exclusão suave no Neo4j. O gráfico descrito em Cypher do ponto de vista de Alice é como tal:
(clyde:User)<-[:FOLLOWS]-(alice:User)-[:LIKES]->(bob:User)
Em vez de realmente excluir um nó e seus relacionamentos, eu sou
mudando seu rótulo para que ele não possa mais ser consultado diretamente, ou seja,User
rotular e adicionar um_User
label (observe o sublinhado)substituindo seus relacionamentos para que ele não possa mais ser alcançado por minhas consultas normais, por exemplo, excluindo sua:FOLLOWS
relações e substituí-lo por:_FOLLOWS
relacionamentos.Portanto, isso é basicamente o equivalente a mover uma linha para uma tabela de arquivamento em um banco de dados relacional. Eu percebi que essa é uma abordagem bastante eficiente, porque você nunca está visitando as partes do gráfico que foram excluídas por software. Além disso, você não precisa modificar nenhuma das suas consultas existentes.
O resultado da exclusão suave de Alice deve ser este:
(clyde:User)<-[:_FOLLOWS]-(alice:_User)-[:_LIKES]->(bob:User)
Minha primeira tentativa na consulta foi esta:
match (user:User {Id: 1})
optional match (user)-[follows:FOLLOWS]->(subject)
remove user:User set user:_User
delete follows
create (user)-[:_FOLLOWS]->(subject);
O problema é que quando este usuário não está seguindo ninguém, a consulta tenta criar um relacionamento entreuser
enull
porque a segunda correspondência é opcional, então isso me dá esse erro:Other node is null.
Minha segunda tentativa foi essa:
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));
Por isso, estou colocando o relacionamento e o assunto em um mapa, coletando esses mapas em uma coleção, jogando todos os mapas "vazios" e passando pela coleção. Mas esta consulta me dá este erro:
SyntaxException: Invalid input '.': expected an identifier character, node labels, a property map, whitespace or ')' (line 1, column 238)
Alguém sabe como eu posso consertar isso?
Obrigado, jan