Neo4j 入门教程 - 使用 Cypher 导入来自 CSV 文件的数据

你可以将 CSV 文件中的数据导入到 Neo4j 数据库中,为此我们来学习下 Cypher 中的 LOAD CSV 语句。

将 CSV 文件导入到 Neo4j 的能力,可以实现从其他类型的数据库来导入数据(比如关系型数据库)。

在 Neo4j 中,你可以通过本地或远端 URL 来加载 CSV 文件。

要访问本地(在数据库服务器上)文件,使用 file:/// 路径。除此之外,可以使用任何 HTTPS,HTTP 和 FTP 协议。

读取 CSV 文件

我们使用 HTTP 协议加载一个名为 genres.csv 的 CSV 文件。它不是一个大文件,这个列表里包含了 115 个音乐流派,所以它将创建 115 个节点(和 230 个属性)。

这个文件上传到了开放的网络中,所以你可以在你的 Neo4j 浏览器中运行下边的代码,它可以直接导入到你的数据库中。

1
2
LOAD CSV FROM 'https://jpanj.com/2018/neo4j-tutorial-import-data-from-csv-file-using-cypher/genres.csv' AS line
CREATE (:Genre {genreId: line[0], name: line[1]})

你也可以忽略 CSV 文件中的某些字段,比如,如果你不希望将第一个字段导入到数据库中,可以从上边的代码中省略 genreId: line[0],

运行上边的 Cypher 语句会产生以下成功消息:

你可以通过以下查询来查看刚刚新创建的节点:

1
MATCH (n:Genre) RETURN n

下边是通过数据可视化界面看到的节点结果:

导入包含标题的 CSV 文件

之前的 CSV 文件不包含任何标题,如果 CSV 文件包含标题,可以使用 WITH HEADERS

使用这个方法还允许你通过它的列名(标题名)来引用每个字段。

我们有另一个带标题的 CSV 文件,该文件包含专辑曲目列表。

同样,这个文件不大,列表中包含了 32 个专辑,所以它将创建 32 个节点(和 96 个属性)。

这个文件也上传到了开放的网络中,所以你可以在你的 Neo4j 浏览器中运行下边的代码,它可以直接导入到你的数据库中。

1
2
LOAD CSV WITH HEADERS FROM 'https://jpanj.com/2018/neo4j-tutorial-import-data-from-csv-file-using-cypher/tracks.csv' AS line
CREATE (:Track { trackId: line.Id, name: line.Track, length: line.Length})

这将产生下边的成功消息:

下边的查询语句可以查看新创建的节点:

1
MATCH (n:Track) RETURN n

同样我们通过可视化框架看到的节点的结果。

点击 Table 图标可以看到每个点和它的三个属性值:

自定义分隔符

如果需要的话你可以指定自定义字段分隔符,假如 CSV 文件中的分隔符是分号的话,你可以指定使用分号作为分隔符而不是逗号。

只需将 FIELDTERMINATOR 子句添加到语句中就可以做到了,像下边这样:

1
2
3
LOAD CSV WITH HEADERS FROM 'https://jpanj.com/2018/neo4j-tutorial-import-data-from-csv-file-using-cypher/tracks.csv' AS line
FIELDTERMINATOR ';'
CREATE (:Track { trackId: line.Id, name: line.Track, length: line.Length})

导入大文件

如果你需要导入包含大量数据的文件,可以使用 PERODIC COMMIT 来处理。

在 Neo4j 中使用定期提交功能可以在导入一定数量的行之后提交一次数据,这减少了事务状态的内存开销。

默认是 1000 行,所以数据会每 1000 行提交一次。

要使用定期提交,只需在语句开头插入 USING PERIODIC COMMIT (在 LOAD CSV 之前)。

下边有个例子:

1
2
3
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'https://jpanj.com/2018/neo4j-tutorial-import-data-from-csv-file-using-cypher/tracks.csv' AS line
CREATE (:Track { trackId: line.Id, name: line.Track, length: line.Length})

设置定期提交频率

你还可以将 1000 行的默认值更改为另一个数字,只需将数字加在 USING PERIODIC COMMIT 后边就行了,就像这样:

1
2
3
USING PERIODIC COMMIT 800
LOAD CSV WITH HEADERS FROM 'https://jpanj.com/2018/neo4j-tutorial-import-data-from-csv-file-using-cypher/tracks.csv' AS line
CREATE (:Track { trackId: line.Id, name: line.Track, length: line.Length})

CSV 的格式要求

以下是使用 LOAD CSV 时应该如何格式化 CSV 文件的一些要求:

  • 字符编码必须是 UTF-8
  • 行终止标识和系统有关,例如在 Unix 中是 \n,在 Windows 上是 \r\n
  • 分隔符必须是逗号,除非用通过 FIELDTERMINATOR 特殊指定
  • 如果字符串是用双引号引起来的,数据读入后会将双引号去掉
  • 任何需要转义的字符都可以通过反斜线 \ 来转义