教程目录 引自:https://neo4j.com/docs/getting-started/cypher-intro/load-csv/
教程:导入数据
本教程演示如何使用 LOAD CSV 从 CSV 文件导入数据。
通过组合 Cypher® 子句 LOAD CSV、MERGE 和 CREATE,您可以将数据导入到 Neo4j 中。LOAD CSV 允许您访问数据值并对其执行操作。
数据文件
在本教程中,您将从以下 CSV 文件导入数据:
persons.csv 内容:
id,name
1,Charlie Sheen
2,Michael Douglas
3,Martin Sheen
4,Morgan Freeman
persons.csv 文件包含 id 和 name 两列。每行代表一个人,具有唯一 id 和姓名。
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、标题、原产国和发行年份。
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)的关系数据。
图模型
数据模型如下所示:
(插入图1)
基于 CSV 文件数据的结果图:
(插入图2)
前提条件
本教程使用 Linux 或 macOS 压缩包安装。
假设您的当前工作目录是压缩包安装的 <neo4j-home> 目录,且 CSV 文件位于默认导入目录中。
其他安装的默认目录请参见操作手册 → 文件位置。
导入位置可以通过操作手册 → server.directories.import 配置。
准备数据库
导入数据之前,您应该通过创建索引和约束来准备要使用的数据库。
您应该通过在 Person 和 Movie 节点上创建约束来确保它们具有唯一的 id 属性。
创建唯一约束也会隐式创建索引。通过为 id 属性建立索引,节点查找(如通过 MATCH)将快得多。
另外,为 country 名称创建索引以实现快速查找也是个好主意。
- 启动 neo4j:
bin/neo4j start
默认用户名是 neo4j,密码是 neo4j。
- 创建约束使每个 Person 节点具有唯一的 id 属性:
使用 Neo4j Browser:
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"
- 创建约束使每个 Movie 节点具有唯一的 id 属性:
使用 Neo4j Browser:
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"
- 为 Country 节点的 name 属性创建索引:
使用 Neo4j Browser:
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 导入数据
- 从 persons.csv 文件加载数据:
使用 Neo4j Browser:
LOAD CSV WITH HEADERS FROM "file:///persons.csv" AS csvLine
CREATE (p:Person {id: toInteger(csvLine.id), name: csvLine.name})
- 从 movies.csv 文件加载数据:
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)
- 从 roles.csv 文件加载数据:
: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
导入数据
使用以下命令检查具有关系的所有节点:
使用 Neo4j Browser:
MATCH (n)-[r]->(m) RETURN n, r, m
或使用 Neo4j Cypher Shell:
bin/cypher-shell --database=neo4j 'MATCH (n)-[r]->(m) RETURN n, r, m'
输出将显示所有节点及其关系。