教程:导入数据

本教程演示如何使用 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。每行代表一个人,该人具有唯一的 id 和一个 name

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。每行代表一部电影,该电影具有唯一的 id、一个 title、一个原产 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 tarball 安装。

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

准备数据库

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

您应该通过为 PersonMovie 节点创建约束,确保它们具有唯一的 id 属性。

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

此外,为国家 name 属性创建索引以便快速查找也是一个好主意。

1. 启动 neo4j。

运行命令

bin/neo4j start

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

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

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

使用 Neo4j Browser,运行以下 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 Browser,运行以下 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 Browser,运行以下 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 Browser,运行以下 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 Browser,运行以下 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 Browser,运行以下 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 支持显式和隐式事务。但是,在 Browser 中,您需要在 CALL {…​} IN TRANSACTIONS 前面加上 :auto。有关更多详细信息,请参阅Cypher 手册 → 事务中的子查询Neo4j Browser 指南 → 命令参考

验证导入的数据

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

使用 Neo4j Browser,运行以下 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}) |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
© . All rights reserved.