官方文檔 https://neo4j.com/developer/guide-import-csv/#_converting_data_values_with_load_csv
一、前提
在進行導入CSV數據前,需要熟悉圖數據庫(graph database)的概念,會構建一個屬性圖性數據模型,和Cypher的基本語法。
二、導入CSV文件的方式
主要的兩種方式如下:
1、使用 Cypher 命令 LOAD CSV ,這種方式可以處理中小型數據(可達10 million條記錄)
2、使用批量導入工具 neo4j-admin ,用來直接導入大數據集
三、上述方式具體導入過程
1、Cypher 命令 LOAD CSV
(1)此命令可以處理本地或遠程文件,導入本地文件,文件名前要加前綴 file:/// ,neo4j 有一個默認的安 全設置,只能從 Neo4j 的特定文件夾導入(Neo4j import directory,操作系統不同,目錄不同);導入遠程文件,直接用其URL
exmples
//Example 1 - file directly placed in import directory (import/data.csv) LOAD CSV FROM "file:///data.csv" ...... //Example 2 - file placed in subdirectory within import directory (import/northwind/customers.csv) LOAD CSV with headers FROM "file:///northwind/customers.csv"
......
(2)從CSV 中讀取的所有數據都是字符串類型,可以通過 toInteger()
, toFloat()
, split()
或其他類似的函數進行轉換
(3)CSV文件首行是字段名,則要加上 ,with headers 具體如樣例如下,且用 property.value 或 property[value] 的形式 ,沒有with headers 使用 property[0] 下標形式。
exmples
文件 person.csv id,name,age 1,zz,20 2,ww,21 3,qq,22 LOAD CSV WITH HEADERS FROM 'file:///person.csv' AS line FIELDTERMINATOR ',' MERGE (:person { id:line.id ,name: line.name, Age: toInteger(line.Age)})
###fieldterminator表示每個值由 ' , ' 分隔開。MERGE
是插入節點或關系 (不存在則插入,存在則更新)
2、批量導入工具 neo4j-admin
這個工具可以指定更大的節點文件和關系文件進行導入,它在neo4j的bin目錄下,用法如下:
bin/neo4j-admin import --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"
上述每個文件的前幾行如下 :
customerId:ID(Customer) | name |
---|---|
23 |
Delicatessen Inc |
42 |
Delicous Bakery |
productId:ID(Product) | name | price | :LABEL |
---|---|---|---|
11 |
Chocolate |
10 |
Product;Food |
orderId:ID(Order) | date | total | customerId:IGNORE |
---|---|---|---|
1041 |
2015-05-10 |
130 |
23 |
1042 |
2015-05-12 |
20 |
42 |
:START_ID(Order) | amount | price | :END_ID(Product) |
---|---|---|---|
1041 |
13 |
130 |
11 |
1042 |
2 |
20 |
11 |
:END_ID(Order) | date:IGNORE | total:IGNORE | :START_ID(Customer) |
---|---|---|---|
1041 |
2015-05-10 |
130 |
23 |
1042 |
2015-05-12 |
20 |
42 |
上述用法樣例代碼解釋, --nodes
和 --relationships
參數是多個有相同結構(列名結構相同)的CSV文件。
具有相同結構的文件疊加在一起,可看成一單個的大文件。每個文件都要有列字段,或者每個文件的列字段也可以單獨放在一個新CSV文件里面(更方便更改信息)。
* --id-type = STRING 表示所有:ID 列都是字母或數字的值。
* 文件customers.csv直接導入成帶有 :Customer 標簽的節點,每個節點的屬性也之間從文件中導入
* 文件Product.csv中的節點標簽則來自文件中的:LABEL 列。
* 節點Order數據來自三個文件,分別是一個頭文件,和兩個數據文件
* 文件 Order_details.csv 中每行記錄的兩個item之間具有的:contain關系,其通過order的id屬性和product的id屬性關聯起來。
列名表示節點或關系的屬性名,具體的列名有具體的markup,一下是上述一些markup的解釋
* name:ID 這是全局id列,用作查找重新連接后的節點
--如果省略屬性名,該列不會存儲在庫中,--id-type指的就是該列。
--如果在不同實體中出現同一個ID,需要括號中告訴ID所屬實體。比如:ID(Order).
--如果ID是全局唯一,則第二條可以省略
* :LABEL 這一列表示節點的標簽,如果節點有多個標簽,可以通過分隔符隔開
* :START_ID , :END_ID 表示關系文件中指向節點的ID列,對於某個group的id,可以使用 :END_ID(Order)
* :TYPE 該列說明了關系的類型
* 所有其他屬性列,如果為空,則跳過;或者標注為 :IGNORE
* 通過在屬性后面加 :INT, :BOOLEAN 等indicators來轉換數據類型