2015-05-29 73 views
2

我通過Java訪問neo4J數據庫,我想創建1,300萬個節點。因此我創建了1,300萬個「CREATE」語句。正如我所知道的那樣,查詢太長了。我只可以執行〜100 CREATE每個查詢語句 - 否則查詢失敗:快速執行多個CREATE語句的方法

Client client; 
WebResource cypher; 
String request; 
ClientResponse cypherResponse; 
String query = ""; 
int nrQueries = 0; 

for(HashMap<String, String> entity : entities){ 
    nrQueries++; 
    query += " CREATE [...] "; 

    if(nrQueries%100==0){ 
     client = Client.create(); 
     cypher = client.resource(SERVER_ROOT_URI + "cypher"); 
     request = "{\"query\":\""+query+"\"}"; 
     cypherResponse = cypher.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, request); 
     cypherResponse.close(); 
     query = ""; 
    } 
} 

嗯,我想執行1,3萬次查詢,我只能聯合收割機100成一個請求,我仍然有13000個請求,這需要很長時間。 有沒有辦法更快地做到這一點?

回答

1

您應該考慮另外兩個選項:import toolLOAD CSV選項。

這裏的正確問題是「如何快速將數據放入neo4j」而不是「如何快速執行大量CREATE語句」。這兩個選項都會比單獨的CREATE陳述更快,所以我不會再混淆個人CREATE了。

Michael Hunger寫了一個great blog post描述了將數據導入neo4j的多個方面,你應該看看你是否想更多地理解爲什麼這些是好的選擇,而不僅僅是它們是好的選擇。

LOAD CSV選項將完全按照名稱的建議進行。你將基本上使用密碼查詢語言直接從文件加載數據,並且由於你在「批處理」(文檔描述了這一點)中提交了記錄,所以它實質上更快。因此,您仍然在使用事務處理來獲取數據,您只需更快速地批量處理數據,並且可以一路創建複雜的關係。

導入工具是相似的,除非它是爲高性能創建大量數據。這裏的魔力(以及它爲什麼如此之快)是因爲它跳過了事務處理層。這既是好事也是壞事,取決於你的觀點(Michael Hunger的博客文章我相信解釋了這種權衡)。

不知道你的數據很難提出具體的建議 - 但作爲一個普遍性,我認爲從LOAD CSV開始作爲默認值,並且當且僅當數據量非常大時才轉移到導入工具,或者您的插入性能要求非常高。這反映了我的觀點略有偏差,即交易是一件好事,而停留在密碼層(而不是使用單獨的命令行工具)也是一件好事,但是YMMV。