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"
上述每个文件的前几行如下 :
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来转换数据类型