2016-12-31 1 views
0

私はノードがあり、(p:Post)と呼び、そのノードは[r:REPLIED_WITH]という他の投稿との関係を持っています(reply:Post)replyは、同じ関係を持つノードをさらに持つことができます。これは、技術的には無限の回答になる可能性があります。 (p)とすべての返信と返信のすべての返信をカスケード形式で削除します。私はDETACH DELETEについて知っていますが、大規模なデータセットではないと言います。実際にはそうでないものは削除しないようにしたいと思っています。ユーザーが投稿を作成した場合はどうすればいいですか。Neo4J投稿の返信を削除せずに返信でユーザーや他の関係を削除しようとしています

のビジュアルについてこれは私が欲しいものですが、私はちょうど最初のポストとポストへの返信や、それらの回答の回答にポストし、すべての返信に答えたすべての投稿を削除したい (p:Post)<-[r:REPLIED_WITH]-(reply:Post)<-[r2:REPLIED_WITH]-(reply2:Post)<-[r3:REPLIED_WITH]-(reply3:Post)...

を削除しました。それは深い無限のレベルかもしれません。

結果が空、その後、ループ内で同じクエリを実行している場合、私はそれを確認した後

MATCH (p:Post) 
WHERE ID(p) = {postID} 
OPTIONAL MATCH (p)<-[r:replied_To]-(reply:Post) 
DELETE p, r 
RETURN ID(reply) 

以外のそれにループロジックを把握することはできません。それだけで状況に取り組む最も効率的な方法ではないようです。

答えて

2

可変長の関係を使用して、削除するノードを識別したいと思うでしょう。

リレーションシップとノードを個別に削除する代わりに、DETACH DELETEを使用することもできます。ノードからのすべての関係が削除されるまで、ノードを削除することはできません。

これは一度にすべてを行うことした場合、クエリは次のようになります。あなたのグラフは、操作がタイムアウトまたは失敗する可能性がある場合、その後、あなたがマークを考慮することができる十分に大きい場合

// lower bound of 0 so the post itself is included in toDelete 
MATCH (p:Post)<-[:replied_To*0..]-(toDelete:Post) 
WHERE ID(p) = {postID} 
DETACH DELETE toDelete 
RETURN ID(toDelete) 

その後の削除アプローチ。

まず、それらを削除するのではなく、削除するノードにラベルを付ける:

MATCH (p:Post)<-[:replied_To*0..]-(toDelete:Post) 
WHERE ID(p) = {postID} 
SET toDelete:ToDelete 

あなたがAPOC Proceduresをインストールした後、あなたがラベルされたきたノードの一括削除にperiodic.commit()手順を使用することができるはずです:ToDelete:

CALL apoc.periodic.commit(" 
MATCH (x:ToDelete) 
WITH x LIMIT {limit} 
DETACH DELETE x 
RETURN COUNT(*) 
",{limit:10000}) 

チャンクが大きすぎる場合は、必要に応じて制限を調整できます。

EDIT

それは特にあなたのように応答チェーン内のノードをマークシナリオ、ここでの可能な競合状態に注意することが重要です:ToDeleteは、その後、別の後にユーザーがどこかにチェーンで応答します。新しい返信(または返信)は、ノードにラベルを付けた後に作成され、一括削除操作では削除されません。

これらのケースを処理するには、最後にクリーンアップクエリを実行して、返信した投稿がなくなった返信を見つけなければならない場合があります。回答はこのように、マルチ標識されたことで

MATCH (x:Reply) 
WHERE NOT()<-[:replied_To]-(x) 
// we've found dangling replies, now delete their chains 
MATCH (x)<-[:replied_To*0..]-(toDelete:Reply) 
DETACH DELETE toDelete 

、それは私たちが上のクエリを実行することができます:あなたは、後でそのようにそれらに一致させることができるように、ポスト:返信など:それはですべての返信を標識するのにも便利です返信ノードだけであり、投稿ではあるが返信ではないノードは考慮しない。

+0

そのperodicコミットは素晴らしいです。私は存在していたことを知らなかった。だから、すべての投稿はユーザーを持っていますが、DETACH DELETEもユーザーを削除しますか?私はDETACH DELETEがそれらのノードが接続されているすべての関係とノードを削除すると信じています。もしそれらが接続されていれば、ユーザーも削除されます。それは正確ですか? –

+0

ユーザーが(p:Post)< - [:WROTE] - (u:User)と接続しています –

+0

正確ではありません。 DETACH DELETEは、削除しているノード、およびそれらに接続されているすべての関係のみを削除します。クエリに含まれていない接続ノードへの削除をカスケードしません。上の例では、ToDeleteというラベルの付いたノードだけでなく、他のノードとの関係も削除されるので、投稿したユーザーはToDeleteというラベルが付いていないため、そのまま残ります。 – InverseFalcon

関連する問題