|| 教程:导入数据 - 入门指南 - Neo4j 文档

教程:导入数据

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

结合 Cypher® 子句 LOAD CSV、MERGE 和 CREATE,您可以将数据导入 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 文件包含两列 id 和 name。每行代表一个人,该人具有唯一的 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 文件包含列 id、title、country 和 year。每行代表一部电影,该电影具有唯一的 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 文件包含列 personId、movieId 和 role。每行代表一个角色,其中包含有关人物 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 目录中。

准备数据库

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

您应该通过为 Person 和 Movie 节点创建约束,确保它们具有唯一的 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 属性创建索引,以确保快速查找。

当将 MERGE 或 MATCH 与 LOAD 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 标签以及 id 和 name 属性的节点。

使用 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 还支持通过 HTTPS、HTTP 和 FTP 访问 CSV 文件,请参阅Cypher 手册 → LOAD CSV。

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

您创建带有 Movie 标签以及 id、title 和 year 属性的节点。

您还可以创建带有 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}) |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
© . This site is unofficial and not affiliated with Neo4j, Inc.