2016-12-06 18 views
1

Cypherを使用してNeo4jデータベース内の特定のノードに関連する接続グラフを削除します。ユースケースは、開始ノードと、開始ノードへのパスが存在するすべてのノードを削除することです。トランザクションを制限するには、クエリは反復的でなければならず、接続されたグラフを切断してはいけません。Cypherで接続グラフを削除

今まで私は、このクエリを使用しています:

OPTIONAL MATCH (start {indexed_prop: $PARAM})--(toDelete) 
OPTIONAL MATCH (toDelete)--(toBind) 
WHERE NOT(id(start) = id(toBind)) AND NOT((start)--(toBind)) 
WITH start, collect(toBind) AS TO_BIND, toDelete limit 10000 
DETACH DELETE toDelete 
WITH start, TO_BIND 
UNWIND TO_BIND AS b 
CREATE (start)-[:HasToDelete]->(b) 

、削除ノードは0

に等しくなるまで、それを呼び出すには、このためのより良いクエリがありますか?

+0

接続されたすべてのノードに可変長のパスを試し、接続されているすべてのノードのDETACH DELETEを試しましたか?それはあなたのヒープを爆破しますか? – InverseFalcon

+0

はい、問題は、クエリが大きなグラフでは機能しないことです。クエリを複数回呼び出すと、接続されたグラフが壊れることがあります。 – cde

答えて

1

可変マッチで接続されたグラフ全体をどのように切り離して削除するのかに似ていますが、DETACH DELETEではなくTO_DELETEラベルを適用することができます。

この(それ以外の場合は、インデックス付きのparamを持つノードを探して全体デシベルをくししているとして、開始ノードに使用するラベルを構成する)ような何か:

MATCH (start:StartNodeLabel {indexed_prop: $PARAM})-[*]-(toDelete) 
SET toDelete:TO_DELETE 

それはあなたを吹く場合ヒープの場合は、SETの前に追加の述語WHERE NOT toDelete:TO_DELETEを付けて、可変長関係の深さにLIMITおよび/または制限の組み合わせを使用して、複数回実行できます。

接続されているすべてのノードにラベルを付けることが確実な場合は、TO_DELETEラベル内のすべてのノードを削除するだけです。繰り返し実行するか、APOCプロシージャapoc.periodic.commit()を使用してそれをバッチで処理します。

関連する問題