Neo4j: implementacja miękkiego usuwania z opcjonalnymi relacjami

Próbuję zaimplementować miękkie usuwanie w Neo4j. Wykres opisany w Cypherze z punktu widzenia Alice jest taki:

(clyde:User)<-[:FOLLOWS]-(alice:User)-[:LIKES]->(bob:User)

Zamiast usuwać węzeł i jego relacje, jestem

zmiana etykiety, aby nie można było jej bezpośrednio przeglądać, tj. upuszczać jej etykietęUser etykieta i dodanie a_User etykieta (zwróć uwagę na podkreślenie)zastępując jego relacje, tak że nie można go już osiągnąć przez moje zwykłe zapytania, np. usuwanie jej:FOLLOWS relacje i zastąpienie ich:_FOLLOWS relacje.

Jest to w zasadzie odpowiednik przeniesienia wiersza do tabeli archiwizacji w relacyjnej bazie danych. Pomyślałem, że jest to dość efektywne podejście, ponieważ nigdy nie odwiedzasz części wykresu, które zostały usunięte. Nie musisz także modyfikować żadnych istniejących zapytań.

Wynikiem łagodnego usuwania Alicji powinno być:

(clyde:User)<-[:_FOLLOWS]-(alice:_User)-[:_LIKES]->(bob:User)

Moja pierwsza próba wykonania zapytania brzmiała:

match (user:User {Id: 1})
optional match (user)-[follows:FOLLOWS]->(subject)
remove user:User set user:_User
delete follows
create (user)-[:_FOLLOWS]->(subject);

Problem polega na tym, że gdy ten użytkownik nie śledzi nikogo, zapytanie próbuje utworzyć relację międzyuser inull ponieważ drugie dopasowanie jest opcjonalne, więc daje mi ten błąd:Other node is null.

Moja druga próba była następująca:

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));

Więc umieszczam relację i temat na mapie, zbierając te mapy w kolekcji, odrzucając każdą „pustą” mapę i zapętlając kolekcję. Ale to zapytanie daje mi ten błąd:

SyntaxException: Invalid input '.': expected an identifier character, node labels, a property map, whitespace or ')' (line 1, column 238)

Czy ktoś wie, jak mogę to naprawić?

Dzięki, Jan

questionAnswers(1)

yourAnswerToTheQuestion