官方文档 https://neo4j.com/developer/guide-import-csv/#_converting_data_values_with_load_csv

一、前提

        在进行导入CSV数据前,需要熟悉图数据库(graph database)的概念,会构建一个属性图性数据模型,和Cypher的基本语法。

二、导入CSV文件的方式

 主要的两种方式如下:

LOAD CSV

neo4j-admin

三、上述方式具体导入过程

  1、Cypher 命令  LOAD CSV

file:///

   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() 或其他类似的函数进行转换

property.value 或 property[value]  的形式 ,没有with headers 使用  property[0]

  exmples

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来转换数据类型