2013-02-04 58 views
11

我一直在試圖運行此查詢的Neo4j的谷歌集團和其他來源網上推薦:刪除使用暗號Neo4j的所有節點和關係超過堆空間

START N =節點(*) MATCHñ - [r?] - () WHERE ID(n)> 0 DELETE n,r;

爲了刪除測試之間的所有節點和關係。當我從控制檯執行此操作時,我用完了Java堆空間。當我從python(使用新的graph_db.clear(),它出現使用相同的查詢)這樣做時,我得到一個「SystemError:無」,我認爲,這是相同的Java堆空間錯誤。我有一個500k節點,只有5k關係和7M屬性的數據庫。我在使用neo4j-1.8.1的8GB RAM的Mac筆記本電腦(10.6.8)上運行。我想我有點驚訝,刪除節點(基本上沒有關係,非常小的子圖)會超過Java堆空間,但我對neo4j的工作原理非常天真。有關如何前進的任何建議,我們感激不盡。我知道數據目錄中的rm -rf從頭開始工作,但我認爲這可能是一個不太激烈的解決方案。

[跨發佈到的Neo4j谷歌團體]

+0

在WITH後面翻頁更加方便和明智:'START n = node(*) MATCH n- [r?] - () WITH n,r LIMIT 10000 DELETE n,r;' –

+0

@MichaelHunger不應該是:'START n =節點(*)WITH n LIMIT 10000 MATCH n - [r?] - ()DELETE n,r;'? – joewhite86

回答

3

從Neo4j 2.3.3開始,引入了一種刪除節點和關係的新方法。請參閱2.3.3 Docs

例如,你可以這樣做:

MATCH(n) DETACH DELETE n; 
+0

這適用於小數據集,但在大型數據庫上激發了我的Java堆空間 – fiat

18

上面的暗號語句導致的所有節點(除了與ID 0的根節點),以在一個單個事務刪除之前被實例化。當使用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; 

然而,有什麼不對刪除整個數據庫目錄,這是很好的實踐。

+1

是的,刪除數據庫文件夾爲+1。 –

+0

我應該想到限制刪除中的節點數量。感謝提示。很明顯,儘管如此,似乎要刪除數據庫目錄。 – seandavi

+5

問號不再用於可選模式。在最近版本的Neo4j中,有必要改變匹配子句爲:可選匹配n- [r] - () – IsidroGH

7

問號不再起作用。使用可選匹配..以下應該工作。

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

+1。你會在上面的例子中得到一個「問號不再用於可選模式 - 使用OPTIONAL MATCH」。 –

9

根據Neo4j的文檔,圖表ISA的刪除通過完成:

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; 

它可以減少節點數量,並最終使用第一個,推薦的和更通用的代碼。

0

你可以增加堆空間,在你neo4j性能,使GC日誌,看堆的上升空間是否真的接近上限。 根據您的初始大小,頁面緩存大小需要減小或增加。 ...減少/增加它並檢查加載時間的影響。 neo4j內存飢餓...需要更大的堆大小,儘可能多的,你可以得到。

相關問題