2015-06-28 115 views
1

玩過玩具數據集之後,這是我第一次嘗試使用與工作項目相關的數據。總之,在我將所有數據都轉換成Neo4j後,我的最後一個查詢就停滯了。看截圖。Neo4j加載CSV導入失速

enter image description here

注:我被將其粘貼到瀏覽器工具原型我的查詢,但我更長期的計劃是讓所有的命令在一個.cql文件,我可以我的工作站上的腳本,以進行夜間分析。

要添加上下文到我的問題,我正在我的macbook原型。

  • 8GB內存
  • 2.2 GHz的英特爾酷睿i7
  • OSX 10.9.5
  • 2.2.0社區

我處理(行/列)的文件。我沒有導入每一列,只是更容易保持我的當前數據集。

  • Ability.csv = 3/1
  • brm.csv =34分之276992
  • cont.sv =一十七分之八萬零九十三
  • 電子郵件chain.csv =34分之199143(這是唯一的數據我無法得到)
  • 電子郵件第一last.csv =二十〇分之七萬七千八百四十九
  • recs.csv =二十〇分之七萬七千九百六十二
  • templates_topics.csv = 29/3
  • templates.csv = 49/4
  • topics.csv = 13/1
  • 廠商= 5/1

的唯一的配置選項,我手動設置Neo4j的均neo4j-wrapper.conf其中I設置wrapper.java.initmemorywrapper.java.maxmemory4096。我在找到類似的問題後做了這個。

我做出了這些更改,因爲在瀏覽器中,我收到了處理我的查詢時數據庫斷開連接的錯誤消息。

最後,由於我的數據與工作相關,因此無法提供測試數據。但是,我可以鏈接到我的密碼查詢。

Constraint and LOAD CSV .cql file

任何幫助和建議將不勝感激。我非常有信心這是用戶錯誤,但我對下一步的工作肯定會走上正軌。

+0

在您最近的加載CSV語句中,您使用'Email:cid'作爲屬性,而您的約束位於'電子郵件:msgid' –

+0

好,趕快看看結果如何。 – Btibert3

+0

這次,當我嘗試從cypher.cql文件的第111行開始執行命令時,瀏覽器中出現「數據庫斷開連接」警告。從命令行運行該文件是否會提供任何性能改進? – Btibert3

回答

2

避免急於加載到加載CSV中。它不尊重PERIODIC COMMIT。請參閱Mark Needham的article以獲取詳細解釋。

+0

我曾經參考過這篇文章幾次。我的第一個問題(在發佈之前)是我沒有考慮使用'MERGE'。我以爲通過使用MATCH + MERGE可以讓自己變得更好,但我相信還有一些地方需要重構。 – Btibert3

+0

您是否嘗試過使用腳本進行「分而治之」,您可能會確定哪個部分是違規的部分,並使用EXPLAIN/PROFILE功能更好地理解導致問題的原因。嘗試(例如)使用關係來分割節點創建,這樣您可以刪除有問題的MERGE。 – ErnestoE

2

我將第二分割這一個,進一次創建節點和創建關係(每個):

USING PERIODIC COMMIT 10000 
LOAD CSV WITH HEADERS FROM "file:///Users/btibert/Dropbox/Projects/bentley-search-neo4j/data/templates.csv" AS row 
WITH row 
MATCH (r:Vendor {name:row.vendor}) 
WITH row, r 
MERGE (p:Template {name:row.template_clean}) 
MERGE (v:Version {version:row.template_ver}) 
MERGE (p)-[:FROM_VERSION]->(v) 
MERGE (p)-[:CREATED_BY]->(r); 

正如你可以清楚地看到在計劃中渴望操作。

我的意思是,如果你只有幾千行這並不重要。但是,如果它走向數十萬甚至數百萬,那麼拉動所有數據需要更多的內存。如果你有每個學生可以使用WITH DISTINCT toInt(row.pidm) as pidm, ....數量減少的合併它運行多行同時 :

+----------------+------------------------------------+------------------------------------------------------------------------------------------------+ 
|  Operator |      Identifiers |                       Other | 
+----------------+------------------------------------+------------------------------------------------------------------------------------------------+ 
| EmptyResult |         |                        | 
| UpdateGraph(0) | anon[270], anon[301], p, r, row, v |                     MergePattern | 
| UpdateGraph(1) |   anon[270], p, r, row, v |                     MergePattern | 
| UpdateGraph(2) |      p, r, row, v | MergeNode; row.template_clean; :Template(name); MergeNode; row.template_ver; :Version(version) | 
|   Eager |        r, row |                        | 
| SchemaIndex |        r, row |                  row.vendor; :Vendor(name) | 
|  LoadCSV |        row |                        | 
+----------------+------------------------------------+------------------------------------------------------------------------------------------------+ 

我可能會改變這種爲ON CREATE SET變種對於非關鍵屬性。

LOAD CSV WITH HEADERS FROM "recs.csv" AS row 
WITH row 
MERGE (s:Student {pidm:toInt(row.pidm)}) 
ON CREATE SET s.hash_pidm=toInt(row.hash_pidm), ....; 

這一次我會分成兩個語句,每一個關係,否則你可能會得到太多的比賽: (你不需要WITH S IN之間)

LOAD CSV WITH HEADERS FROM "...recs.csv" AS row 
WITH row 
MATCH (s:Student {pidm: toInt(row.pidm)}) 
MATCH (v:Vendor {name: row.vendor}) 
MATCH (a:Ability {name: row.ability}) 
WITH row, s, v, a 
MERGE (s)-[:PURCHASED_FROM]->(v) 
MERGE (s)-[:HAS_ABILITY]->(a); 

將成爲:

LOAD CSV WITH HEADERS FROM "...recs.csv" AS row 
MATCH (s:Student {pidm: toInt(row.pidm)}) 
MATCH (v:Vendor {name: row.vendor}) 
MERGE (s)-[:PURCHASED_FROM]->(v); 


LOAD CSV WITH HEADERS FROM "...recs.csv" AS row 
MATCH (s:Student {pidm: toInt(row.pidm)}) 
MATCH (a:Ability {name: row.ability}) 
MERGE (s)-[:HAS_ABILITY]->(a); 

這裏我還要對自己創建的聯繫人信息。 (再次上創建SET) ,做在一個單獨的語句中的師生關係:

LOAD CSV WITH HEADERS FROM "....cont.csv" AS row 
MERGE (c:Contact {cid:row.cid}) ON CREATE SET ....; 

LOAD CSV WITH HEADERS FROM "...cont.csv" AS row 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (c:Contact {cid:row.cid}) 
MERGE (s)-[:HAS_CONTACT]->(c); 

我還要拆這一個到兩個語句:

LOAD CSV WITH HEADERS FROM "...cont.csv" AS row 
WITH row WHERE toInt(row.seqnum) = 1 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (f:Contact {cid:row.first_cont}) 
MERGE (s)-[:FIRST]->(f); 

LOAD CSV WITH HEADERS FROM "...cont.csv" AS row 
WITH row WHERE toInt(row.seqnum) = 1 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (l:Contact {cid:row.last_cont}) 
MERGE (s)-[:LAST]->(l); 

斯普利特這一個進入E-郵件創建和後來通過MSG-ID將其連接到學生:

LOAD CSV WITH HEADERS FROM "...brm.csv" AS row 
MERGE (e:Email {msgid:row.msgid}) ON CREATE SET ... ; 

LOAD CSV WITH HEADERS FROM "file:///Users/btibert/Dropbox/Projects/bentley-search-neo4j/data/brm.csv" AS row 
MATCH (s:Student {pidm:toInt(row.pidm)}) 
MATCH (e:Email {msgid:row.msgid}) 
MERGE (s)-[:WAS_SENT]->(e); 

HTH邁克爾