neo4j-導入CSV數據


官方文檔 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"

  上述每個文件的前幾行如下 : 

Table 1. customers.csv
customerId:ID(Customer) name

23

Delicatessen Inc

42

Delicous Bakery 

  

 

 

 

 

Table 2. products.csv
productId:ID(Product) name price :LABEL

11

Chocolate

10

Product;Food

 

 

 

 

Table 3. orders_header.csv,orders1.csv,orders2.csv
orderId:ID(Order) date total customerId:IGNORE

1041

2015-05-10

130

23

1042

2015-05-12

20

42

 

 

 

 

 

Table 4. order_details.csv
:START_ID(Order) amount price :END_ID(Product)

1041

13

130

11

1042

2

20

11

 

 

 

 

 

Table 5. customer_orders_header.csv,orders1.csv,orders2.csv
: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來轉換數據類型

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM