有几种不同的方法可以将 CSV 数据导入到 Neo4j,不同的方法对应不同的情况,它取决于数据的大小规模以及您对工具或方法的熟悉程度。
三种方式
Neo4j 读取和导入 CSV 文件数据有如下三种方法:
- 使用 Cypher 命令
LOAD CSV
,它可以中小型规模的数据集(最多 1000 万条记录),适用于任何设置,包括 AuraDB。 - 使用 neo4j-admin 批量导入工具,适用于直接加载大型数据集,适用于 Neo4j Desktop、Neo4j EE 的 Docker 镜像和本地的安装。
- 使用 Kettle 导入工具,映射和执行数据处理流程的步骤,适用于非常大的数据集,特别是如果开发人员已经熟悉使用此工具。适用于任何设置,包括 AuraDB。
使用 Cypher 加载 CSV 命令
使用 Cypher 语句 LOAD CSV
进行数据导入,该语句后面跟着的子句,可以有多个方面的组合操作:
- 支持从 URI 导入 csv 数据;
- 直接将输入数据映射到复杂的图结构;
- 处理数据转换;
- 支持复杂的计算;
- 支持创建或合并实体、关系和结构。
csv 格式数据准备
CSV 文件首行是字段名,对于 neo4j 来说,其实是属性对应的列,假设我们有如下 CSV 实体数据文件:
Id,Name,Location,Email,BusinessType 1,Neo4j,San Mateo,contact@neo4j.com,P 2,AAA,,info@aaa.com, 3,BBB,Chicago,,G
由于 CSV 文件首行是字段名,则要加上 WITH HEADERS,并通过 MERGE 定义真实要设置的属性名和属性值,示例如下:
// 跳过 NULL 值
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
WITH row WHERE row.Id IS NOT NULL
MERGE (c:Company {companyId: row.Id});
// clear data
MATCH (n:Company) DELETE n;
// 为 NULL 值设置默认值
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
MERGE (c:Company {companyId: row.Id, hqLocation: coalesce(row.Location, "Unknown")})
// clear data
MATCH (n:Company) DELETE n;
// 设置空字符串为 NULL 值
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
MERGE (c:Company {companyId: row.Id})
SET c.emailAddress = CASE trim(row.Email) WHEN "" THEN null ELSE row.Email END
如果 CSV 中有一个字段是要拆分的 item 列表,则可以使用 Cypher 的 split()
函数来分隔单元格中的数组。
csv 导入命令 load csv
load csv 命令可以处理本地或远程文件:
-
导入本地文件,文件名前要加前缀
file:///
;此外,由于 neo4j 的默认的安全设置,文件只能从 Neo4j 的特定文件夹导入(Neo4j import directory,操作系统不同,目录不同),以 mac os 为例如下:/Users/knowledgedict/Library/Application Support/Neo4j Desktop/Application/relate-data/dbmss/dbms-8ba83fc3-9182-471a-b261-837ad9d93cc2/import
将要导入的 csv 文件存放该目录下即可,示例如下:
knowledgedict@Mac import $ pwd /Users/knowledgedict/Library/Application Support/Neo4j Desktop/Application/relate-data/dbmss/dbms-8ba83fc3-9182-471a-b261-837ad9d93cc2/import knowledgedict@Mac import $ ls -ltrh total 8 -rw-r--r--@ 1 honey staff 112B 8 23 19:35 companies.csv
-
导入远程文件,直接用其 URL 即可。
接着上面的 companies.csv
例子, 这里再创建 employees.csv
实体数据,如下:
Id,Name,Skills,Email 1,Joe Smith,Cypher:Java:JavaScript,joe@neo4j.com 2,Mary Jones,Java,mary@neo4j.com 3,Trevor Scott,Java:JavaScript,trevor@neo4j.com
导入上述数据,并将雇佣人员和技能(Skills)建立关系(relationship),具体如下:
LOAD CSV WITH HEADERS FROM 'file:///employees.csv' AS row
MERGE (e:Employee {employeeId: row.Id, email: row.Email})
WITH e, row
UNWIND split(row.Skills, ':') AS skill
MERGE (s:Skill {name: skill})
MERGE (e)-[r:HAS_EXPERIENCE]->(s)
条件转换可以通过 CASE
:
// clear data
MATCH (n:Company) DELETE n;
//set businessType property based on shortened value in CSV
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
WITH row WHERE row.Id IS NOT NULL
WITH row,
(CASE row.BusinessType
WHEN 'P' THEN 'Public'
WHEN 'R' THEN 'Private'
WHEN 'G' THEN 'Government'
ELSE 'Other' END) AS type
MERGE (c:Company {companyId: row.Id, hqLocation: coalesce(row.Location, "Unknown")})
SET c.emailAddress = CASE trim(row.Email) WHEN "" THEN null ELSE row.Email END
SET c.businessType = type
RETURN *