13

私は、neo4j google グループおよびオンラインの他のソースで推奨されているように、このクエリを実行しようとしています。

START n = node(*) MATCH n-[r?]-() WHERE ID(n)>0 DELETE n, r;

テスト間のすべてのノードと関係を削除するため。コンソールからそうすると、Java ヒープ領域が不足します。Pythonからそうすると(同じクエリを使用しているように見える新しいgraph_db.clear()を使用して)、同じJavaヒープスペースエラーであると思われる「SystemError:None」が表示されます。50 万のノード、5,000 のリレーションシップのみ、および 700 万のプロパティを持つデータベースがあります。neo4j-1.8.1を使用して、8GB RAMを搭載したMacラップトップ(10.6.8)で実行しています。ノードを削除すると (基本的にリレーションシップがないため、サブグラフが非常に小さい)、Java ヒープ スペースを超えることに少し驚いたと思いますが、neo4j の動作についてはかなり素朴です。前進する方法についての提案は大歓迎です。データディレクトリで rm -rf を使用してゼロから開始しても機能することはわかっていますが、それほど劇的ではない解決策があるかもしれないと考えました。

[neo4j google グループにクロス投稿]

4

6 に答える 6

19

上記のcypherステートメントにより、すべてのノード(ID 0のルートノードを除く)がインスタンス化されてから、1つのトランザクションで削除されます。これは、500kノードで実行するとメモリを大量に消費します。

削除するノードの数を、たとえば次のように10k〜50k程度に制限してみてください。

START n = node(*) 
MATCH n-[r?]-() 
WHERE (ID(n)>0 AND ID(n)<10000) 
DELETE n, r;

START n = node(*) 
MATCH n-[r?]-() 
WHERE (ID(n)>0 AND ID(n)<20000) 
DELETE n, r;

ただし、データベースディレクトリ全体を削除しても問題はありません。これは良い習慣です。

于 2013-02-04T16:50:25.343 に答える
10

neo4j のドキュメントによると、グラフの削除は次の方法で行われます。

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r;

Java ヒープ スペース エラーを回避するために、このコードを LIMIT と組み合わせました。

MATCH (n)
OPTIONAL MATCH (n)-[r]-()
WITH n,r LIMIT 100000 DELETE n,r;

ノード数を減らすように機能し、最終的には最初の推奨されたより一般的なコードを使用できるようになります。

于 2015-05-28T13:40:07.257 に答える
7

疑問符が機能しなくなりました。オプションの一致を使用してください..以下が機能するはずです。

               START n = node(*) 
               OPTIONAL MATCH n-[r]-() 
               WHERE (ID(n)>0 AND ID(n)<10000) 
               DELETE n, r;
于 2014-09-17T05:33:49.787 に答える
4

Neo4j 2.3.3 の時点で、ノードと関係を削除する新しい方法が導入されました。2.3.3 ドキュメントを参照してください。

たとえば、次のことができます。

MATCH(n) DETACH DELETE n;
于 2016-04-22T02:18:25.070 に答える
1

Neo4J ナレッジ ベース [1] でより良い解決策を見つけました。

CALL apoc.periodic.iterate(
    "MATCH (n) RETURN n",
    "DETACH DELETE n",
    {batchSize:1000}
)
YIELD batches, total RETURN batches, total

[1] - https://neo4j.com/developer/kb/large-delete-transaction-best-practices-in-neo4j/

于 2019-08-01T10:30:44.820 に答える