3

Neo4j でソフト削除を実装しようとしています。アリスの観点から Cypher で説明されているグラフは次のとおりです。

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

ノードとその関係を実際に削除する代わりに、

  1. ラベルを変更して、直接検索できないようにする。つまり、ラベルを削除してUserラベルを追加する_User(アンダースコアに注意)
  2. その関係を置き換えて、通常のクエリではもう到達できないようにします。たとえば、その関係を削除して: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)

これを修正する方法を知っている人はいますか?

ありがとう、ヤン

4

1 に答える 1

3

最初にラベルを変更してから、関係を照合していただけますか? 次に、「オプションではない」一致を使用できるようにする必要があり、フォロー関係がない場合に対処する必要はありません。

MATCH (user:User {Id: 1})
REMOVE user:User SET user:_User
WITH user
MATCH (user)-[follows:FOLLOWS]->(subject)
DELETE follows
CREATE (user)-[:_FOLLOWS]->(subject)

または、ユーザー、フォロー、サブジェクトを持ち、サブジェクトが null でない場所でフィルタリングすることもできます。何かのようなもの

MATCH (user:User {Id: 1})
OPTIONAL MATCH (user)-[follows:FOLLOWS]->(subject)
REMOVE user:User SET user:_User
WITH user, follows, subject
WHERE subject IS NOT NULL
DELETE follows
CREATE (user)-[:_FOLLOWS]->(subject)

編集:
複数の種類の関係に対してこれを行いたいことが問題である場合は、試すことができます

MATCH (user:User {Id: 1})
REMOVE user:User SET user:_User
WITH user 
MATCH (user)-[f:FOLLOWS]->(other)
DELETE f 
CREATE (user)-[:_FOLLOWS]->(other)
WITH user LIMIT 1 
MATCH (user)-[l:LIKES]->(other)
DELETE l 
CREATE user-[:_LIKES]->(other)

複数の一致はユーザーに対して複数の結果があることを意味するuserため、実行するときは必ず制限してください。そうしないと、次のクエリ部分を複数回実行することになります。(user)-[r]->(other)

関係タイプを動的に構築できないため(つまり、CREATE (a)-[newRel:"_"+type(oldRel)]->(b)機能しないため) 、サイファーでそれを行う一般的な方法はないと思います

あなたが探しているのはそのようなものですか、それとも私はあなたの質問を誤解していますか?

于 2013-12-16T09:44:11.173 に答える