教程:导入数据
本教程演示如何使用 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 tarball 安装。
它假设您当前的工作目录是 tarball 安装的 <neo4j-home> 目录,并且 CSV 文件放置在默认的 import 目录中。
|
准备数据库
在导入数据之前,您应该通过创建索引和约束来准备要使用的数据库。
您应该通过为 Person
和 Movie
节点创建约束,确保它们具有唯一的 id
属性。
创建唯一约束也会隐式创建索引。通过索引 id
属性,节点查找(例如通过 MATCH
)将大大加快。
此外,为国家 name
属性创建索引以便快速查找也是一个好主意。
1. 启动 neo4j。
运行命令
bin/neo4j start
默认用户名为 |
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
属性创建索引,以确保快速查找。
使用 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
|
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
节点,然后在它们之间创建关系即可。
对于大型数据文件,最佳实践是使用子查询 |
使用 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
请注意, |
验证导入的数据
通过查找所有具有关系的节点来检查结果数据集。
使用 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}) |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+