精华 Neo4j官方教程:第17节, 导入数据
发布于 2 天前 作者 pangguoming 36 次浏览 来自 分享

教程目录 引自: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)的关系数据。

图模型

数据模型如下所示:

image(插入图1)

基于 CSV 文件数据的结果图:

image(插入图2)

前提条件

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

假设您的当前工作目录是压缩包安装的 <neo4j-home> 目录,且 CSV 文件位于默认导入目录中。

其他安装的默认目录请参见操作手册 → 文件位置。

导入位置可以通过操作手册 → server.directories.import 配置。

准备数据库

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

您应该通过在 Person 和 Movie 节点上创建约束来确保它们具有唯一的 id 属性。

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

另外,为 country 名称创建索引以实现快速查找也是个好主意。

  1. 启动 neo4j:
bin/neo4j start

默认用户名是 neo4j,密码是 neo4j。

  1. 创建约束使每个 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"
  1. 创建约束使每个 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"
  1. 为 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 导入数据

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

使用 Neo4j Browser:

LOAD CSV WITH HEADERS FROM "file:///persons.csv" AS csvLine
CREATE (p:Person {id: toInteger(csvLine.id), name: csvLine.name})
  1. 从 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)
  1. 从 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'

输出将显示所有节点及其关系。

回到顶部