教程:导入数据
本教程演示了如何使用 LOAD CSV
从 CSV 文件导入数据。
结合 Cypher® 子句 LOAD CSV
、MERGE
和 CREATE
,您可以将数据导入 Neo4j。LOAD CSV
允许您访问数据值并对其执行操作。
|
数据文件
在本教程中,您将从以下 CSV 文件导入数据
-
persons.csv
-
movies.csv
-
roles.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 文件的内容
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 文件的内容
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 文件)的关系数据。
先决条件
本教程使用 Linux 或 macOS 压缩包安装。
它假定您的当前工作目录是压缩包安装的 <neo4j-home> 目录,并且 CSV 文件放置在默认的 import 目录中。
|
准备数据库
在导入数据之前,您应该通过创建索引和约束来准备要使用的数据库。
您应该确保 Person
和 Movie
节点具有唯一的 id
属性,方法是在它们上创建约束。
创建唯一约束也会隐式创建索引。通过索引 id
属性,节点查找(例如通过 MATCH
)将快得多。
此外,最好索引国家/地区 name
以实现快速查找。
1. 启动 neo4j。
运行命令
bin/neo4j start
默认用户名为 |
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
属性上创建索引,以确保快速查找。
使用 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
标签和 id
和 name
属性的节点。
使用 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
|
2. 从 movies.csv 文件加载数据。
您将创建具有 Movie
标签和 id
、title
和 year
属性的节点。
您还将创建具有 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
节点,然后在它们之间创建关系。
对于较大的数据文件,最佳实践是使用子查询 |
使用 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
请注意, |
验证导入的数据
通过查找所有具有关系的节点来检查结果数据集。
使用 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}) |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+