Neo4j 基础教程

Neo4j CQL

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/neo4j-import-csv-data.html

Neo4j 导入 csv 文件数据(包含节点和关系)详解

Neo4j 导入数据各种方式详解 Neo4j 导入数据各种方式详解


有几种不同的方法可以将 CSV 数据导入到 Neo4j,不同的方法对应不同的情况,它取决于数据的大小规模以及您对工具或方法的熟悉程度。

三种方式

Neo4j 读取和导入 CSV 文件数据有如下三种方法:

  1. 使用 Cypher 命令 LOAD CSV,它可以中小型规模的数据集(最多 1000 万条记录),适用于任何设置,包括 AuraDB。
  2. 使用 neo4j-admin 批量导入工具,适用于直接加载大型数据集,适用于 Neo4j Desktop、Neo4j EE 的 Docker 镜像和本地的安装。
  3. 使用 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 命令可以处理本地或远程文件:

  1. 导入本地文件,文件名前要加前缀 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
  2. 导入远程文件,直接用其 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 *

 

在Java中导入CSV文件有多种方式,下面将介绍三种常用的方式,包括使用纯Java、ApacheCommonsCSV库以及OpenCSV库的 ...
Neo4j 导入数据有多种形式,支持 csv、json 等格式的数据文件导入,也支持 api 接口导入数据,还可以将 rdbms 关系型数据 ...
以下是一些主要的Django版本及其对应的Python版本关系:###Django1.9请注意,这只是一个大致的版本对应关系,不同的Djan ...
python 读取 csv 形式的数据,有非常多的方式,这里主要介绍常用的几种方式,从基于标准库到 pandas 等开源库自带的函数。 ...
Neo4j 删除节点(node)或关系等 DELETE 操作,都需要搭配 MATCH 命令,也就是先要匹配查询要删除的节点,然后再 DELE ...