2016-03-19 51 views
0

我有一個數據庫填充了大約81MB的CSV數據。Neo4j 2.3.2 - 無法啓動數據庫

的數據有,我想明確地創造出一些隱含的關係,所以我跑以下命令:

with range(0,9) as numbers 
unwind numbers as n 
match (ks:KbWordSequence) where ks.kbid ends with tostring(n) 
match (kt:KbTextWord {kbid: ks.kbid}) 
create (kt)-[:SEQUENCE]->(ks) 
create (ks)-[:TEXT]->(kt) 

在運行的代碼我開始看到大量的這些消息的.log文件:

2016-03-19 19:27:30.740+0000 WARN [o.n.k.i.c.MonitorGc] GC Monitor: Application threads blocked for 9149ms. 

在看到這些GC消息一段時間後,看到進程佔用了6G的RAM,我終止了Windows進程並嘗試再次創建關係。

當我這樣做時,我得到以下錯誤,數據庫將無法啓動。

Starting Neo4j failed: Component '[email protected]' was successfully initialized, but failed to start. Please see attached cause exception. 

在.log文件或任何其他相應的消息中我都看不到任何錯誤。

這種錯誤的其他示例對應於Neo4j數據庫版本不匹配,在我的情況中並非如此。

我該如何從這種狀況中恢復?

回答

0

我猜事務增長過大,因爲這條語句似乎觸發了全局操作。首先了解預期操作的大小:

with range(0,9) as numbers 
unwind numbers as n 
match (ks:KbWordSequence) where ks.kbid ends with tostring(n) 
match (kt:KbTextWord {kbid: ks.kbid}) 
return count(*) 

作爲經驗法則〜10k到100k原子操作是一個很好的事務大小。考慮到這一點適用skiplimit控制交易規模:

with range(0,9) as numbers 
unwind numbers as n 
match (ks:KbWordSequence) where ks.kbid ends with tostring(n) 
match (kt:KbTextWord {kbid: ks.kbid}) 
with ks, kt skip 0 limit 50000 
create (kt)-[:SEQUENCE]->(ks) 
create (ks)-[:TEXT]->(kt) 
return count(*) 

並運行此聲明幾次,直到你回來的0值。

根據實際使用情況,可能會有更有效的方法阻止跳過使用並直接在匹配中檢測尚未處理的節點。

+0

對此合併的「解釋」是 - 根據它估計它將處理的記錄數量而言令人驚歎,考慮到KbTextWord有5001條記錄,而KbWordSequence有1281793行,這很奇怪。 –