教程:导入数据

本教程演示了如何使用 LOAD CSV 从 CSV 文件导入数据。

结合 Cypher® 子句 LOAD CSVMERGECREATE,您可以将数据导入 Neo4j。LOAD CSV 允许您访问数据值并对其执行操作。

数据文件

在本教程中,您将从以下 CSV 文件导入数据

  • persons.csv

  • movies.csv

  • roles.csv

persons.csv 文件的内容

persons.csv
id,name
1,Charlie Sheen
2,Michael Douglas
3,Martin Sheen
4,Morgan Freeman

persons.csv 文件包含两列 idname。每行代表一个具有唯一 idname 的人。

movies.csv 文件的内容

movies.csv
id,title,country,year
1,Wall Street,USA,1987
2,The American President,USA,1995
3,The Shawshank Redemption,USA,1994

movies.csv 文件包含列 idtitlecountryyear。每行代表一部具有唯一 idtitle、原产地 country 和发行 year 的电影。

roles.csv 文件的内容

roles.csv
personId,movieId,role
1,1,Bud Fox
3,1,Carl Fox
2,1,Gordon Gekko
3,2,A.J. MacInerney
2,2,President Andrew Shepherd
4,3,Ellis Boyd 'Red' Redding

roles.csv 文件包含列 personIdmovieIdrole。每行代表一个角色,包含有关人员 id(来自 persons.csv 文件)和电影 id(来自 movies.csv 文件)的关系数据。

图模型

以下数据模型显示了此数据集的图模型可能是什么样子

getting started load csv01 arr

这是基于 CSV 文件中数据的最终图

getting started load csv02 arr

先决条件

本教程使用 Linux 或 macOS 压缩包安装。

它假定您的当前工作目录是压缩包安装的 <neo4j-home> 目录,并且 CSV 文件放置在默认的 import 目录中。

准备数据库

在导入数据之前,您应该通过创建索引和约束来准备要使用的数据库。

您应该确保 PersonMovie 节点具有唯一的 id 属性,方法是在它们上创建约束。

创建唯一约束也会隐式创建索引。通过索引 id 属性,节点查找(例如通过 MATCH)将快得多。

此外,最好索引国家/地区 name 以实现快速查找。

1. 启动 neo4j。

运行命令

bin/neo4j start

默认用户名为 neo4j,密码为 neo4j

2. 创建约束,使每个 Person 节点具有唯一的 id 属性。

您将在 Person 节点的 id 属性上创建约束,以确保具有 Person 标签的节点将具有唯一的 id 属性。

使用 Neo4j 浏览器,运行以下 Cypher

CREATE CONSTRAINT personIdConstraint FOR (person:Person) REQUIRE person.id IS UNIQUE

或者使用 Neo4j Cypher Shell,运行命令

bin/cypher-shell --database=neo4j "CREATE CONSTRAINT personIdConstraint FOR (person:Person) REQUIRE person.id IS UNIQUE"

3. 创建约束,使每个 Movie 节点具有唯一的 id 属性。

您将在 Movie 节点的 id 属性上创建约束,以确保具有 Movie 标签的节点将具有唯一的 id 属性。

使用 Neo4j 浏览器,运行以下 Cypher

CREATE CONSTRAINT movieIdConstraint FOR (movie:Movie) REQUIRE movie.id IS UNIQUE

或者使用 Neo4j Cypher Shell,运行命令

bin/cypher-shell --database=neo4j "CREATE CONSTRAINT movieIdConstraint FOR (movie:Movie) REQUIRE movie.id IS UNIQUE"

4. 为 Country 节点创建 name 属性的索引。

Country 节点的 name 属性上创建索引,以确保快速查找。

使用 MERGEMATCHLOAD CSV 时,请确保您在要合并的属性上具有 索引唯一约束。这将确保查询以高效的方式执行。

使用 Neo4j 浏览器,运行以下 Cypher

CREATE INDEX FOR (c:Country) ON (c.name)

或者使用 Neo4j Cypher Shell,运行命令

bin/cypher-shell --database=neo4j "CREATE INDEX FOR (c:Country) ON (c.name)"

使用 LOAD CSV 导入数据

1. 从 persons.csv 文件加载数据。

您将创建具有 Person 标签和 idname 属性的节点。

使用 Neo4j 浏览器,运行以下 Cypher

LOAD CSV WITH HEADERS FROM "file:///persons.csv" AS csvLine
CREATE (p:Person {id: toInteger(csvLine.id), name: csvLine.name})

或者使用 Neo4j Cypher Shell,运行命令

bin/cypher-shell --database=neo4j 'LOAD CSV WITH HEADERS FROM "file:///persons.csv" AS csvLine CREATE (p:Person {id:toInteger(csvLine.id), name:csvLine.name})'

输出

Added 4 nodes, Set 8 properties, Added 4 labels

LOAD CSV 还支持通过 HTTPSHTTPFTP 访问 CSV 文件,请参阅 Cypher 手册 → LOAD CSV

2. 从 movies.csv 文件加载数据。

您将创建具有 Movie 标签和 idtitleyear 属性的节点。

您还将创建具有 Country 标签的节点。使用 MERGE 可避免在多部电影具有相同的原产地国家/地区时创建重复的 Country 节点。

类型为 ORIGIN 的关系将连接 Country 节点和 Movie 节点。

使用 Neo4j 浏览器,运行以下 Cypher

LOAD CSV WITH HEADERS FROM "file:///movies.csv" AS csvLine
MERGE (country:Country {name: csvLine.country})
CREATE (movie:Movie {id: toInteger(csvLine.id), title: csvLine.title, year:toInteger(csvLine.year)})
CREATE (movie)-[:ORIGIN]->(country)

或者使用 Neo4j Cypher Shell,运行命令

bin/cypher-shell --database=neo4j 'LOAD CSV WITH HEADERS FROM "file:///movies.csv" AS csvLine MERGE (country:Country {name:csvLine.country}) CREATE (movie:Movie {id:toInteger(csvLine.id), title:csvLine.title, year:toInteger(csvLine.year)}) CREATE (movie)-[:ORIGIN]->(country)'

输出

Added 4 nodes, Created 3 relationships, Set 10 properties, Added 4 labels

3. 从 roles.csv 文件加载数据

roles.csv 文件导入数据只是找到 Person 节点和 Movie 节点,然后在它们之间创建关系。

对于较大的数据文件,最佳实践是使用子查询 CALL {…​} IN TRANSACTIONS。此子查询告诉 Neo4j 查询可能会累积过多的事务状态,因此需要分批提交。有关更多信息,请参阅 Cypher 手册 → CALL {} (子查询)

使用 Neo4j 浏览器,运行以下 Cypher

:auto LOAD CSV WITH HEADERS FROM 'file:///roles.csv' AS csvLine
CALL {
 WITH csvLine
 MATCH (person:Person {id: toInteger(csvLine.personId)}), (movie:Movie {id: toInteger(csvLine.movieId)})
CREATE (person)-[:ACTED_IN {role: csvLine.role}]->(movie)
} IN TRANSACTIONS OF 2 ROWS

使用 Cypher Shell,您可以运行命令

bin/cypher-shell --database=neo4j 'LOAD CSV WITH HEADERS FROM "file:///roles.csv" AS csvLine CALL {WITH csvLine MATCH (person:Person {id: toInteger(csvLine.personId)}), (movie:Movie {id: toInteger(csvLine.movieId)}) CREATE (person)-[:ACTED_IN {role: csvLine.role}]->(movie)} IN TRANSACTIONS OF 2 ROWS'

输出

Created 5 relationships, Set 5 properties

请注意,CALL {…​} IN TRANSACTIONS 仅在 隐式 事务中允许。Cypher Shell 支持显式事务和隐式事务。但是,在浏览器中,您需要在 CALL {…​} IN TRANSACTIONS 之前加上 :auto。有关更多详细信息,请参阅 Cypher 手册 → 事务中的子查询Neo4j 浏览器指南 → 命令参考

验证导入的数据

通过查找所有具有关系的节点来检查结果数据集。

使用 Neo4j 浏览器,运行以下 Cypher

MATCH (n)-[r]->(m) RETURN n, r, m

或者使用 Neo4j Cypher Shell,运行命令

bin/cypher-shell --database=neo4j 'MATCH (n)-[r]->(m) RETURN n, r, m'

输出

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| n                                                               | r                                               | m                                                               |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| (:Movie {id: 3, title: "The Shawshank Redemption", year: 1994}) | [:ORIGIN]                                       | (:Country {name: "USA"})                                        |
| (:Movie {id: 2, title: "The American President", year: 1995})   | [:ORIGIN]                                       | (:Country {name: "USA"})                                        |
| (:Movie {id: 1, title: "Wall Street", year: 1987})              | [:ORIGIN]                                       | (:Country {name: "USA"})                                        |
| (:Person {name: "Martin Sheen", id: 3})                         | [:ACTED_IN {role: "Carl Fox"}]                  | (:Movie {id: 1, title: "Wall Street", year: 1987})              |
| (:Person {name: "Charlie Sheen", id: 1})                        | [:ACTED_IN {role: "Bud Fox"}]                   | (:Movie {id: 1, title: "Wall Street", year: 1987})              |
| (:Person {name: "Michael Douglas", id: 2})                      | [:ACTED_IN {role: "Gordon Gekko"}]              | (:Movie {id: 1, title: "Wall Street", year: 1987})              |
| (:Person {name: "Michael Douglas", id: 2})                      | [:ACTED_IN {role: "President Andrew Shepherd"}] | (:Movie {id: 2, title: "The American President", year: 1995})   |
| (:Person {name: "Martin Sheen", id: 3})                         | [:ACTED_IN {role: "A.J. MacInerney"}]           | (:Movie {id: 2, title: "The American President", year: 1995})   |
| (:Person {name: "Morgan Freeman", id: 4})                       | [:ACTED_IN {role: "Ellis Boyd 'Red' Redding"}]  | (:Movie {id: 3, title: "The Shawshank Redemption", year: 1994}) |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+