首页 > 技术文章 > neo4j-导入CSV数据

z-bear 2019-12-10 18:43 原文

官方文档 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)nameprice:LABEL

11

Chocolate

10

Product;Food

 

 

 

 

Table 3. orders_header.csv,orders1.csv,orders2.csv
orderId:ID(Order)datetotalcustomerId:IGNORE

1041

2015-05-10

130

23

1042

2015-05-12

20

42

 

 

 

 

 

Table 4. order_details.csv
:START_ID(Order)amountprice: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:IGNOREtotal: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来转换数据类型

 

 

推荐阅读