- Neo4j權威指南 (圖數據庫技術叢書)
- 張幟
- 2821字
- 2020-11-28 15:15:51
2.5 批量導入工具的使用
在初次使用Neo4j圖數據庫時,很多讀者需要將自己使用的關系數據庫或用其他存儲形式存儲的數據批量導入到Neo4j圖數據庫中。為此,本節將介紹怎樣使用Neo4j導入工具來批量導入數據。
目前,導入到Neo4j的工具有兩種:load csv指令和neo4j-import工具,這兩種都是基于CSV文件的,既然需要CSV文件,那么有必要先考慮如何從其他數據庫中獲取CSV文件。
先介紹從傳統的關系數據庫導出CSV文件,然后用Neo4j的兩種導入工具導入到Neo4j數據庫中,本節只介紹導入工具的實際操作步驟,關于兩種導入工具的更詳細參數及使用方法參見“5.6 Neo4j數據庫管理相關工具”一節。
2.5.1 獲取CSV文件
下面介紹幾種主流關系數據庫導出CSV文件的方法。
2.5.1.1 SQL Server導出CSV文件
打開一個查詢窗口,輸入SQL語句查詢出需要導出的數據列表,如圖2-63所示。

圖2-63 SQL查詢
在查詢的結果欄目中,復制所有查詢出來的數據。右擊,在快捷菜單中選擇“將結果另存為”,如圖2-64所示。

圖2-64 查詢結果另存為
這里可以選擇保存為CSV文件或者是txt文件,我們選擇CSV文件,如圖2-65所示。用Excel打開CSV文件,就可以看到CSV文件的內容了。

圖2-65 保存CSV文件
2.5.1.2 MySQL導出CSV文件
MySQL支持將查詢結果直接導出為CSV文本格式,在使用select語句查詢數據時,在語句后面加上導出指令即可,格式如下:
● into outfile <導出的目錄和文件名>:指定導出的目錄和文件名。
● fields terminated by <字段間分隔符>:定義字段間的分隔符。
● optionally enclosed by <字段包圍符>:定義包圍字段的字符(數值型字段無效)。
● lines terminated by <行間分隔符>:定義每行的分隔符。
下面舉一個使用MySQL導出CSV文件的例子:
【程序2-18】MySQL導出CSV文件
select * from mydatatable where mytag like 'E1%' into outfile 'E:\E1.csv' fields terminated by ', ' optionally enclosed by '"' lines terminated by '\r\n';
此條指令執行后,會把mydatatable表中部分匹配查詢條件的記錄導出到E1.csv文件中。其中每個字段以逗號分隔,字段內容是以雙引號包圍的字符串,每條記錄使用\r\n換行,如圖2-66所示。

圖2-66 CSV文件格式
2.5.1.3 Oracle導出CSV文件
可以使用sqlplus導出CSV文件,這是比較方便的一種方式,當然讀者也可以考慮采用其他方式。
首先創建spool.sql文件,內容如下:
【程序2-19】創建spool.sql文件
set colsep , set feedback off set heading off set trimout on spool E:\user.csv select '"' || user_name || '", "' || user_age || '", "' || user_card || '", "' || user_sex || '", "' || user_addres || '", "' || user_tel || '"' from user_ bl; spool off exit
然后,運行sqlplus命令:
sqlplus -s用戶名/密碼@數據庫名 @spool.sql
這樣就從Oracle中將lfc_ bl表中的數據導出到E:\lfc_ bl.csv里面了。
對于spool.sql文件的指令詳細解析請參考表2-2所示。
表2-2 sqlplus命令參照

2.5.1.4 CSV內容格式注意事項
Neo4j對CSV文件的格式是有要求的,在討論如何導入CSV之前,先把CSV文件中一些常見的錯誤列舉出來。讀者可以使用文本編輯器打開自己的CSV文件查看是否出現以下錯誤。
CSV文件內容格式常見錯誤如下:
(1)在CSV文件開始處存在BOM字節順序標記(2個UTF-8字符),如果存在需要刪除它們。
(2)文件內存在非文本類型的字符,如果存在就刪除它們。
(3)存在不規則換行符,如:混合Windows和UNIX換行符,如果有需要確保它們一致,最好選擇UNIX風格。
(4)CSV文件頭與數據不一致(內容相比頭缺少列或多出列,頭中有不同的分隔符),如有此情況需要修復頭部。
(5)帶引號和不帶引號的文本字段中出現換行符,如存在就刪除換行符。
(6)存在雜散的引號,非文本中存在獨立雙引號或單引號,如存在就轉義或刪除雜散引號。
2.5.2 使用Load CSV指令導入到Neo4j
Neo4j提供了Load CSV命令幫助我們將CSV數據文件導入到Neo4j中,下面給出幾個讀取CSV文件,但不存入數據庫的例子。
2.5.2.1 簡單導入CSV數據
Load CSV讀取但不存入數據庫:
// 查看前CSV文件行數 LOAD CSV FROM "file-url" AS line RETURN count(*); // 查看前CSV文件前5行 LOAD CSV FROM "file-url" AS line WITH line RETURN line LIMIT 5; //查看前CSV文件,并帶有頭部數據 LOAD CSV WITH HEADERS FROM "file-url" AS line WITH line RETURN line LIMIT 5;
上述例子僅僅是用來讀取CSV文件,它并沒有將數據存入到數據庫中。下面介紹Load CSV的用法。
LOAD CSV FROM "file-url" AS line,這條指令就是將指定路徑下的CSV文件讀取出來,其中"file-url"就是文件的地址,可以是本地文件路徑也可以是網址,只要能從地址中讀取到CSV文件即可,因此也可以這樣寫:
LOAD CSV FROM 'http://we-yun.com/neo4jguide/movie.csv' AS line RETURN line
這樣就可以讀取網址指定的movie.csv文件。
或者可以使用本地文件路徑:
LOAD CSV FROM ' file:///E:/products.csv' AS line RETURN line
這樣就可以讀取到E:/products.csv文件。
如果把CSV文件放置在Neo4j系統路徑的import文件夾內,就只不需要指定CSV文件的路徑,如下所示,可以讀取到放入import文件夾內的products.csv文件。
LOAD CSV FROM ' file:/// products.csv' AS line RETURN line
對于Return語句,它是用來返回并顯示結果到結果顯示區的語句。
對于Limit語句,是用來限制返回的行數。
這樣就可以讀取CSV文件了,但它并沒有存入到數據庫中,要導入到Neo4j數據庫中需要使用相應的Create語句,下例可以讀取網址指定的movie.csv文件并批量創建節點Movie,每個節點的title、released和tagline屬性由導入的CSV文件的每行指定。
LOAD CSV FROM 'http://we-yun.com/neo4jguide/movie.csv' AS line CREATE (:Movie { title: line[0] , released: line[1] , tagline: line[2]})
執行完上面語句后,會看到結果顯示區顯示了所創建的節點數量,如圖2-67所示。

圖2-67 顯示區顯示了所創建的節點數量
然后,用以下語句來查看下數據庫內是否已經有導入的數據了:
MATCH (n:Movie) RETURN n
運行上面語句后,可以得到如圖2-68所示的結果。

圖2-68 查詢導入后結果
如上圖所示,這說明已經導入數據成功了。
2.5.2.2 導入CSV時附帶表頭
下例介紹如何在導入CSV時附帶上表頭。
LOAD CSV WITH HEADERS FROM 'http://we-yun.com/neo4jguide/tracks.csv ' AS line CREATE (:Track { TrackId: line.Id, Name: line.Track, Length: line.Length})
上述語句添加了WITH HEADERS子句,它的功能就是在導入CSV時附帶上頭部,頭部由line.Id、line.Track指定。執行完上面語句后,可使用下面語句查看一下:
MATCH (n:Track) RETURN n
將得到如圖2-69所示的結果。

圖2-69 查詢導入后結果
可以看到,每個數據元素都帶有TrackId、 Name、Length頭部元素。
2.5.2.3 導入CSV大文件
如果要導入包含大量數據的CSV文件,則可以使用PERODIC COMMIT子句。
使用PERIODIC COMMIT指示Neo4j在執行完一定行數后提交數據再繼續,這樣減少了內存開銷。
使用PERIODIC COMMIT默認值為1000行,因此數據將每一千行提交一次。
要使用PERIODIC COMMIT,只需在LOAD CSV語句之前插入USING PERIODIC COMMIT語句。
具體使用方法如下所示。
USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM 'http://we-yun.com/neo4jguide/tracks.csv' AS line CREATE (:Track { TrackId: line.Id, Name: line.Track, Length: line.Length})
可以讓其每800行提交一次,如下所示。
USING PERIODIC COMMIT 800 LOAD CSV WITH HEADERS FROM 'http://we-yun.com/neo4jguide/tracks.csv' AS line CREATE (:Track { TrackId: line.Id, Name: line.Track, Length: line.Length})
2.5.3 使用neo4j-import工具導入到Neo4j
從Neo4j 2.2版本開始,系統就自帶了一個大數據量的導入工具:neo4j-import,可支持并行、可擴展的大規模CSV數據導入。下面介紹使用這個工具導入CSV數據。
首先,可以在Neo4j系統目錄下的path/to/neo4j/bin/neo4j-import路徑下找到這個工具的可執行文件。下面是使用示例:
bin/neo4j-import --into retail.db --id-type string \ --nodes:Customer customers.csv --nodes products.csv \ --nodes:orders_header.csv, orders1.csv, orders2.csv \ --relationships:CONTAINS order_details.csv \ --relationships:ORDERED customer_orders_header.csv, orders1.csv, orders2.csv
上例中以“--nodes:”子句開頭的CSV文件是節點csv文件;以“--relationships:”開頭的是關系CSV文件;“--into”子句指明了導入的Neo4j數據庫名稱;“--id-type”子句指明了生成節點、關系的主鍵類型為string類型。
由于neo4j-import工具不能使用Cypher語句創建節點、關系,所以需要為節點和關系分別提供不同的csv文件。上例中各個文件的列的組織形式如表2-3~表2-7所示。
表2-3 customers.csv文件格式

表2-4 products.csv文件格式

表2-5 orders_header.csv, orders1.csv, orders2.csv文件格式

表2-6 order_details.csv文件格式

表2-7 customer_orders_header.csv, orders1.csv, orders2.csv文件格式

對于上面各個CSV文件的內容解析如下:
(1)customers.csv中的全部記錄將作為節點直接導入到Neo4j數據庫中,其中節點都帶有Customer標簽節點屬性,直接從CSV文件的每條記錄中獲取。
(2)products.csv文件導入形式與customers.csv相同,但其中節點標簽取自:LABEL列(Product或者Food)。
(3)對于節點的順序取自3個文件(orders_header.csv、orders1.csv、orders2.csv),一個頭文件和兩個內容文件。
(4)接下來需要創建訂單項(orders1.csv、orders2.csv)與所包含的產品(products.csv)相關聯關系“CONTAINS”,這個關聯關系是從order_details.csv創建的,通過其ID將訂單與所包含的產品相關聯。
(5)訂單可以通過orders1.csv、orders2.csv文件關聯到客戶。
初學者可以參照本例中各個CSV文件的列格式制作自己的CSV文件,再使用neo4j-import工具進行導入。
- 深入核心的敏捷開發:ThoughtWorks五大關鍵實踐
- Mastering Zabbix(Second Edition)
- Java異步編程實戰
- SOA實踐
- Mastering Articulate Storyline
- Python金融數據分析
- Mastering Scientific Computing with R
- Raspberry Pi 2 Server Essentials
- PLC編程及應用實戰
- Oracle Database 12c Security Cookbook
- JavaScript入門經典
- 青少年學Python(第1冊)
- ExtJS高級程序設計
- Salesforce Reporting and Dashboards
- INSTANT Sinatra Starter