官方文档 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来转换数据类型