Neo4j でソフト削除を実装しようとしています。アリスの観点から Cypher で説明されているグラフは次のとおりです。
(clyde:User)<-[:FOLLOWS]-(alice:User)-[:LIKES]->(bob:User)
ノードとその関係を実際に削除する代わりに、
- ラベルを変更して、直接検索できないようにする。つまり、ラベルを削除して
User
ラベルを追加する_User
(アンダースコアに注意) - その関係を置き換えて、通常のクエリではもう到達できないようにします。たとえば、その関係を削除して
:FOLLOWS
関係に置き換えるなど:_FOLLOWS
です。
したがって、これは基本的に、リレーショナル データベースのアーカイブ テーブルに行を移動することと同じです。ソフト削除されたグラフの部分に実際にアクセスすることはないため、これは非常に効率的なアプローチであると考えました。また、既存のクエリを変更する必要はありません。
Alice のソフト削除の結果は次のようになります。
(clyde:User)<-[:_FOLLOWS]-(alice:_User)-[:_LIKES]->(bob:User)
クエリでの私の最初の試みはこれでした:
match (user:User {Id: 1})
optional match (user)-[follows:FOLLOWS]->(subject)
remove user:User set user:_User
delete follows
create (user)-[:_FOLLOWS]->(subject);
問題は、このユーザーが誰もフォローしていない場合、クエリは と の間の関係を作成しようとすることuser
ですnull
。2 番目の一致はオプションであるため、次のエラーが発生します。Other node is null.
私の2回目の試みはこれでした:
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));
そのため、関係と主題をマップに入れ、これらのマップをコレクションに収集し、すべての「空の」マップを捨てて、コレクションをループします。しかし、このクエリでは次のエラーが表示されます。
SyntaxException: Invalid input '.': expected an identifier character, node labels, a property map, whitespace or ')' (line 1, column 238)
これを修正する方法を知っている人はいますか?
ありがとう、ヤン