2012-12-11 183 views
4

我從表中導入了23億個關係,導入速度不是很快,每小時獲得5M的速度,需要20天的時間才能完成遷移。我聽說過neo4j批量插入和和batch insert utility。該實用程序通過從csv文件導入來做有趣的事情,但最新的代碼是一些如何破碎和不運行。使用Neo4j批量插入

我在neo4j中有大約100M的關係,我必須全部檢查是否應該沒有重複的關係。

我怎樣才能快速的東西在Neo4j的

通過當前的代碼是這樣

begin transaction 
for 50K relationships 
create or get user node for user A 
create or get user node for user B 
check there is relationship KNOW between A to B if not create the relationhsip 
end transaction 

我也閱讀以下內容:

+0

有關當前如何執行導入的更多詳細信息會有幫助。批處理服務本質上是一種在單個HTTP請求中向服務器發送多個命令的方式,可減少HTTP開銷。 –

+0

我正在讀取數據從數據庫和導入嵌入式neo4j。 – mtariq

+0

你有什麼破的細節嗎?我們很想解決它。 –

回答

0

你如何做「獲取用戶A的用戶節點」,從索引查找?索引查找確實減慢了批量插入。嘗試在索引的前面簡單的HashMap中緩存儘可能大的一部分用戶,或者使用BatchInserterIndex#setCacheCapacity

+0

是從索引查找,如果沒有那麼創建它,如何使用批量插入? – mtariq

+0

http://docs.neo4j.org/chunked/milestone/batchinsert.html以及http://github.com/jexp/batch-import中的實現示例 –

3

如果存在關係,並且假設您有足夠的存儲空間,那麼我會嘗試不在導入階段建立獨特的關係 - 現在我實際上也在導入一個帶有〜3mil記錄的SQL表,但我總是創建一個關係,不介意它是否重複。

您可以稍後後導入簡單地做一個暗號查詢將瞭解創建像這種獨特的關係:

START n=node(*) MATCH n-[:KNOW]-m 
CREATE UNIQUE n-[:KNOW2]-m; 

START r=rel(*) where type(r)='KNOW' delete r; 

至少這是我現在的做法和運行後暗號查詢只需要幾分鐘。問題可能出在你真的有兩百個節點時,密碼查詢可能會陷入內存錯誤(取決於你爲neo4j引擎設置多少緩存)