LOAD CSV
用于将数据从 CSV 文件导入 Neo4j 数据库。
LOAD CSV FROM 'https://data.neo4j.com/bands/artists.csv'
AS row
MERGE (:Artist {name: row[1], year: toInteger(row[2])})
FROM 包含STRING CSV 文件所在路径。 | |
该子句一次解析一行,将当前行临时存储在用 指定的变量中AS 。 | |
该MERGE子句访问row 变量以将数据插入数据库。 |
LOAD CSV
支持本地和远程 URL。本地路径是相对于 Neo4j 安装文件夹解析的。
将 CSV 数据导入 Neo4j
导入本地文件
您可以将 CSV 文件存储在数据库服务器上,然后使用 URL 访问它们file:///
。默认情况下,路径是相对于 Neo4j 导入目录解析的。
1,ABBA,1992
2,Roxette,1986
3,Europe,1979
4,The Cardigans,1992
LOAD CSV FROM 'file:///artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN a.name, a.year
一个名字 | 一年 |
---|---|
4 行 添加了 4 个节点,设置了 8 个属性,添加了 4 个标签 | |
|
|
|
|
|
|
|
|
有关将数据导入 Aura 实例的方法,请参阅Aura → 导入数据。 |
使用file:/// URL 时,空格和其他非字母数字字符必须进行URL 编码。 |
文件 URL 的配置设置
从远程位置导入
您可以从远程路径上托管的 CSV 文件导入数据。
LOAD CSV
支持通过 HTTPS、HTTP 和 FTP(有或无凭证)访问 CSV 文件。它还可以遵循重定向,但更改协议的重定向除外(出于安全原因)。
1,ABBA,1992
2,Roxette,1986
3,Europe,1979
4,The Cardigans,1992
LOAD CSV FROM 'https://data.neo4j.com/bands/artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN a.name, a.year
一个名字 | 一年 |
---|---|
4 行 添加了 4 个节点,设置了 8 个属性,添加了 4 个标签 | |
|
|
|
|
|
|
|
|
LOAD CSV FROM 'https://data.neo4j.com/bands/artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN a.name, a.year
LOAD CSV FROM 'ftp://<username>:<password>@<domain>/bands/artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN a.name, a.year
一个名字 | 一年 |
---|---|
4 行 添加了 4 个节点,设置了 8 个属性,添加了 4 个标签 | |
|
|
|
|
|
|
|
|
从云 URI 导入
从 Google Cloud Storage URI 导入
您可以从托管在 Google Cloud Storage URI 中的 CSV 文件导入数据。
1,ABBA,1992
2,Roxette,1986
3,Europe,1979
4,The Cardigans,1992
LOAD CSV FROM 'gs://gs-bucket/artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN a.name, a.year
一个名字 | 一年 |
---|---|
4 行 添加了 4 个节点,设置了 8 个属性,添加了 4 个标签 | |
|
|
|
|
|
|
|
|
从 AWS S3 URI 导入
您可以从托管在 AWS S3 URI 中的 CSV 文件导入数据。
1,ABBA,1992
2,Roxette,1986
3,Europe,1979
4,The Cardigans,1992
LOAD CSV FROM 's3://aws-bucket/artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN a.name, a.year
一个名字 | 一年 |
---|---|
4 行 添加了 4 个节点,设置了 8 个属性,添加了 4 个标签 | |
|
|
|
|
|
|
|
|
导入压缩的 CSV 文件
LOAD CSV
可以读取使用 ZIP 或 gzip 压缩的本地 CSV 文件。ZIP 档案可以具有任意目录结构,但只能包含单个 CSV 文件。
LOAD CSV FROM 'file:///artists.zip' AS row
MERGE (:Artist {name: row[1], year: toInteger(row[2])})
您无法从远程 URL 加载压缩的 CSV 文件。 |
从关系数据库导入数据
如果源数据来自关系模型,则值得评估如何从迁移到图形数据模型中获得最大收益。在运行导入之前,请考虑如何将数据建模为图形,并在运行导入时相应地调整其结构(请参阅图形数据建模)。
关系数据库中的数据可能包含一个或多个 CSV 文件,具体取决于源数据库结构。一种高效的方法是运行多遍导入LOAD CSV
节点,并将其与关系分开。
源文件books.csv包含作者和书籍的信息。从图的角度来看,这些是具有不同标签的节点,因此需要不同的查询来加载它们。
该示例对该文件执行多次LOAD CSV
,每次执行均侧重于创建一个实体类型。
id,title,author,publication_year,genre,rating,still_in_print,last_purchased
19515,The Heights,Anne Conrad,2012,Comedy,5,true,2023/4/12 8:17:00
39913,Starship Ghost,Michael Tyler,1985,Science Fiction|Horror,4.2,false,2022/01/16 17:15:56
60980,The Death Proxy,Tim Brown,2002,Horror,2.1,true,2023/11/26 8:34:26
18793,Chocolate Timeline,Mary R. Robb,1924,Romance,3.5,false,2022/9/17 14:23:45
67162,Stories of Three,Eleanor Link,2022,Romance|Comedy,2,true,2023/03/12 16:01:23
25987,Route Down Below,Tim Brown,2006,Horror,4.1,true,2023/09/24 15:34:18
// Create `Book` nodes
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/books.csv' AS row
MERGE (b:Book {id: row.id, title: row.title})
MERGE (a:Author {name: row.author});
// Create `WROTE` relationships
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/books.csv' AS row
MATCH (a:Author{name: row.author})
MATCH (b:Book{id: row.id})
MERGE (a)-[:WROTE]->(b);
Added 11 nodes, Set 17 properties, Added 11 labels
Created 6 relationships
acted_in.csv文件包含有关演员与其所演电影之间关系的数据(来自persons.csv和movies.csvperson_tmdbId
)。演员和电影通过他们的 ID 列和链接在一起movieId
。
该文件还包含演员在电影中扮演的角色,并将其作为关系属性导入 Neo4j。
movieId,person_tmdbId,role
1,12899,Slinky Dog (voice)
1,12898,Buzz Lightyear (voice)
...
LOAD CSV
导入此数据集需要三个子句:前两个Person
子句从persons.csv创建节点,从movies.csvMovie
创建节点,第三个子句从acted_in.csv添加关系。:ACTED_IN
// Create person nodes
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/persons.csv' AS row
MERGE (p:Person {name: row.name, tmdbId: row.person_tmdbId});
// Create movie nodes
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/movies.csv' AS row
MERGE (m:Movie {movieId: row.movieId, title: row.title});
// Create relationships
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/acted_in.csv' AS row
MATCH (p:Person {tmdbId: row.person_tmdbId})
MATCH (m:Movie {movieId: row.movieId})
MERGE (p)-[r:ACTED_IN {role: row.role}]->(m);
Added 444 nodes, Set 888 properties, Added 444 labels
Added 93 nodes, Set 186 properties, Added 93 labels
Created 372 relationships, Set 372 properties
有关将 Northwind 数据集从 Postgres 导入 Neo4j 的指南,请参阅入门指南中 的教程:将数据从关系数据库导入 Neo4j 。 |
创建附加节点标签
在 Neo4j 中,一个节点可以有多个标签,而在关系设置中,混合实体并不那么简单。例如,Neo4j 中的节点可以同时标记为Dog
和Actor
,而在关系模型中,狗和演员是独立的实体。
导入关系数据集后,可能还会根据用例添加更多标签。如果在查询中使用其他标签,则可以加快节点的定位速度。
Actor
标签Person
acted_in.csv:ACTED_IN
中的关系隐式地将演员定义为人员的子集。以下查询为所有具有外向关系的人员添加了附加标签。Actor
:ACTED_IN
MATCH (p:Person)-[:ACTED_IN]->()
WITH DISTINCT p
SET p:Actor
Added 353 labels
导入期间预处理数据
将 CSV 列转换为 Neo4j 数据类型
LOAD CSV
将所有导入的 CSV 数据作为STRING
属性插入。但是,Neo4j 支持多种数据类型,使用适当类型存储数据可以更有效地查询数据,并使用类型特定的 Cypher ®函数对其进行处理。
文件中persons.csv 的列person_tmdbId
和分别包含和值。函数和允许在导入这些值之前将其转换为适当的类型。born
INTEGER
DATE
toInteger()
date()
person_tmdbId,bio,born,bornIn,died,person_imdbId,name,person_poster,person_url
3,"Legendary Hollywood Icon Harrison Ford was born on July 13, 1942 in Chicago, Illinois. His family history includes a strong lineage of actors, radio personalities, and models. Harrison attended public high school in Park Ridge, Illinois where he was a member of the school Radio Station WMTH. Harrison worked as the lead voice for sports reporting at WMTH for several years. Acting wasn’t a major interest to Ford until his junior year at Ripon College when he first took an acting class...",1942-07-13,"Chicago, Illinois, USA",,148,Harrison Ford,https://image.tmdb.org/t/p/w440_and_h660_face/5M7oN3sznp99hWYQ9sX0xheswWX.jpg,https://themoviedb.org/person/3
...
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/persons.csv' AS row
MERGE (p:Person {tmdbId: toInteger(row.person_tmdbId)})
SET p.name = row.name, p.born = date(row.born)
RETURN
p.name AS name,
p.tmdbId AS tmdbId,
p.born AS born
LIMIT 5
姓名 | 数据库编号 | 出生 |
---|---|---|
5 行 添加了 444 个节点,设置了 1332 个属性,添加了 444 个标签 | ||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
有关类型转换函数的列表,请参阅转换数据值。
处理null
值
Neo4j 不存储null
值。 null
可以跳过 CSV 文件中的某些字段或用默认值替换这些字段LOAD CSV
。
null
示例 10. 处理带有值的文件
在文件中companies.csv
,有些行没有为某些列指定值。示例显示了如何处理null
值的几种选项。
Id,Name,Location,Email,BusinessType
1,Neo4j,San Mateo,contact@neo4j.com,P
2,AAA,,info@aaa.com,
3,BBB,Chicago, ,G
,CCC,Michigan,info@ccc.com,G
null
值
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
WITH row
WHERE row.Id IS NOT NULL
MERGE (c:Company {id: row.Id})
null
值
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
WITH row
WHERE row.Id IS NOT NULL
MERGE (c:Company {id: row.Id, hqLocation: coalesce(row.Location, "Unknown")})
STRING
为null
值(未存储)
LOAD CSV WITH HEADERS FROM 'file:///companies.csv' AS row
WITH row
WHERE row.Id IS NOT NULL
MERGE (c:Company {id: row.Id})
SET c.email = nullIf(trim(row.Email), "")
null 值不存储在数据库中。选择性删除某些值的策略是将它们映射到null 值中。上一个查询中的空STRING 值就是一个例子。 |
拆分列表值
该函数split()
允许将STRING
元素转换为列表。
文件movies.csv包含一个标题行和总共94行。
列languages
和genres
包含列表式的值。两者之间用竖线分隔|
,split()
允许在将它们插入数据库之前将它们制作成 Cypher 列表。
movieId,title,budget,countries,movie_imdbId,imdbRating,imdbVotes,languages,plot,movie_poster,released,revenue,runtime,movie_tmdbId,movie_url,year,genres
1,Toy Story,30000000.0,USA,114709,8.3,591836,English,A cowboy doll is profoundly threatened and jealous when a new spaceman figure supplants him as top toy in a boy's room.,https://image.tmdb.org/t/p/w440_and_h660_face/uXDfjJbdP4ijW5hWSBrPrlKpxab.jpg,1995-11-22,373554033.0,81,862,https://themoviedb.org/movie/862,1995,Adventure|Animation|Children|Comedy|Fantasy
2,Jumanji,65000000.0,USA,113497,6.9,198355,English|French,"When two kids find and play a magical board game, they release a man trapped for decades in it and a host of dangers that can only be stopped by finishing the game.",https://image.tmdb.org/t/p/w440_and_h660_face/vgpXmVaVyUL7GGiDeiK1mKEKzcX.jpg,1995-12-15,262797249.0,104,8844,https://themoviedb.org/movie/8844,1995,Adventure|Children|Fantasy
...
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/movies.csv' AS row
MERGE (m:Movie {id: toInteger(row.movieId)})
SET
m.title = row.title,
m.imdbId = toInteger(row.movie_imdbId),
m.languages = split(row.languages, '|'),
m.genres = split(row.genres, '|')
RETURN
m.title AS title,
m.imdbId AS imdbId,
m.languages AS languages,
m.genres AS genres
LIMIT 5
标题 | imdb编号 | 语言 | 类型 |
---|---|---|---|
5 行 添加了 93 个节点,设置了 465 个属性,添加了 93 个标签 | |||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
有关更多STRING
操作函数,请参阅字符串函数。
建议
创建唯一性约束
导入数据之前,请务必创建唯一性约束,以避免重复或冲突实体。如果源文件包含重复数据且存在正确的约束,Cypher 会引发错误。
person_tmdbId,bio,born,bornIn,died,person_imdbId,name,person_poster,person_url
3,"Legendary Hollywood Icon Harrison Ford was born on July 13, 1942 in Chicago, Illinois. His family history includes a strong lineage of actors, radio personalities, and models. Harrison attended public high school in Park Ridge, Illinois where he was a member of the school Radio Station WMTH. Harrison worked as the lead voice for sports reporting at WMTH for several years. Acting wasn’t a major interest to Ford until his junior year at Ripon College when he first took an acting class...",1942-07-13,"Chicago, Illinois, USA",,148,Harrison Ford,https://image.tmdb.org/t/p/w440_and_h660_face/5M7oN3sznp99hWYQ9sX0xheswWX.jpg,https://themoviedb.org/person/3
...
CREATE CONSTRAINT Person_tmdbId IF NOT EXISTS
FOR (p:Person) REQUIRE p.tmdbId IS UNIQUE
Added 1 constraints
处理大量数据
LOAD CSV
包含大量行(接近数十万或数百万)的文件可能会遇到内存问题。对于大型文件,建议通过子句将导入过程拆分为几个较轻的事务CALL {…} IN TRANSACTIONS。
文件persons.csv包含一个标题行,总共 869 行。示例加载了200 行交易中的name
和列。born
person_tmdbId,bio,born,bornIn,died,person_imdbId,name,person_poster,person_url
3,"Legendary Hollywood Icon Harrison Ford was born on July 13, 1942 in Chicago, Illinois. His family history includes a strong lineage of actors, radio personalities, and models. Harrison attended public high school in Park Ridge, Illinois where he was a member of the school Radio Station WMTH. Harrison worked as the lead voice for sports reporting at WMTH for several years. Acting wasn’t a major interest to Ford until his junior year at Ripon College when he first took an acting class...",1942-07-13,"Chicago, Illinois, USA",,148,Harrison Ford,https://image.tmdb.org/t/p/w440_and_h660_face/5M7oN3sznp99hWYQ9sX0xheswWX.jpg,https://themoviedb.org/person/3
...
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/persons.csv' AS row
CALL {
WITH row
MERGE (p:Person {tmdbId: row.person_tmdbId})
SET p.name = row.name, p.born = row.born
} IN TRANSACTIONS OF 200 ROWS
Added 444 nodes, Set 1332 properties, Added 444 labels
如果出现错误,在提交CALL {…} IN TRANSACTIONS 事务时可能仅导入部分 CSV 数据。例如,如果前 200 行没有错误,则提交这些行。如果接下来的 200 行包含导致错误的数据,则第二个事务会失败,但第一个事务不会受到影响。 |
加载 CSV 和 Neo4j 函数
使用以下方式访问线路号码linenumber()
此函数提供正在操作的linenumber()行号,或者在上下文之外调用的行号。LOAD CSV
null
LOAD CSV
此函数的一个常见用例是为尚无唯一列的 CSV 数据生成连续唯一 ID。
linenumber()
1,ABBA,1992
2,Roxette,1986
3,Europe,1979
4,The Cardigans,1992
LOAD CSV FROM 'file:///artists.csv' AS row
RETURN linenumber() AS number, row
数字 | 排 |
---|---|
4 行 | |
|
|
|
|
|
|
|
|
使用以下方式访问 CSV 文件路径file()
该函数提供正在操作的file()文件的绝对路径,或者在上下文之外调用。LOAD CSV
null
LOAD CSV
file()
1,ABBA,1992
2,Roxette,1986
3,Europe,1979
4,The Cardigans,1992
LOAD CSV FROM 'file:///artists.csv' AS row
RETURN DISTINCT file() AS path
file() 始终返回本地路径,即使加载远程 CSV 文件也是如此。对于远程资源,file() 返回下载到的临时本地路径。 |
CSV 文件格式
CSV文件格式及LOAD CSV
交互如下:
-
文件字符编码必须为UTF-8。
-
行终止符取决于系统(
\n
对于 Unix 和\r\n
Windows)。 -
默认的字段分隔符是
,
。使用选项 进行更改FIELDTERMINATOR
。 -
CSV 文件可能包含带引号的值,读取数据
STRING
时会删除引号。LOAD CSV
-
如果
dbms.import.csv.legacy_quote_escaping
设置为默认值true
,\
则用作转义字符。 -
双引号必须放在引号中
STRING
并进行转义,可以使用转义字符或第二个双引号。
标头
如果 CSV 文件以包含列名的标题行开始,则文件中的每个导入行都充当映射而不是数组。
WITH HEADERS
您必须通过添加到查询来指示标题行的存在。然后,您可以通过相应的列名访问特定字段。
Id,Name,Year
1,ABBA,1992
2,Roxette,1986
3,Europe,1979
4,The Cardigans,1992
LOAD CSV WITH HEADERS FROM 'file:///artists-with-headers.csv' AS row
MERGE (a:Artist {name: row.Name, year: toInteger(row.Year)})
RETURN
a.name AS name,
a.year AS year
姓名 | 年 |
---|---|
4 行 添加了 4 个节点,设置了 8 个属性,添加了 4 个标签 | |
|
|
|
|
|
|
|
|
字段分隔符
默认字段分隔符为,
。使用该FIELDTERMINATOR
选项可指定不同的字段分隔符。
如果您尝试导入未使用,
字段分隔符的文件并且也未指定自定义分隔符,LOAD CSV
则会将 CSV 解释为具有单列。
;
示例 17. 使用字段分隔符导入 CSV
1;ABBA;1992
2;Roxette;1986
3;Europe;1979
4;The Cardigans;1992
LOAD CSV FROM 'file:///artists-fieldterminator.csv' AS row FIELDTERMINATOR ';'
MERGE (:Artist {name: row[1], year: toInteger(row[2])})
Added 4 nodes, Set 8 properties, Added 4 labels
如果在前面添加 ,则可以将 unicode 字符的十六进制表示形式用作字段分隔符\u 。用四位数字写下编码:例如,\u003B 相当于; (分号)。 |
引号转义
STRING
CSV 文件中允许使用引号,LOAD CSV
读取数据时将删除引号。如果引号STRING
必须包含引号字符"
,则有两种方法可以对其进行转义:
-
双引号 — 使用另一个引号
"
来转义引号(例如,STRING
The "Symbol"
is的 CSV 编码"The ""Symbol"""
)。 -
带反斜杠的前缀
\
— 如果配置设置dbms.import.csv.legacy_quote_escaping
设为true
(默认值),\
则用作引号的转义字符(例如,STRING
The "Symbol"
is的 CSV 编码"The \"Symbol\""
)。
"1","The ""Symbol""","1992"
"2","The \"Symbol\"","1992"
LOAD CSV FROM 'file:///artists-with-escaped-quotes.csv' AS row
MERGE (a:Artist {id: toInteger(row[0]), name: row[1], year: toInteger(row[2])})
RETURN
a.id AS id,
a.name AS name,
a.year AS year,
size(a.name) AS size
ID | 姓名 | 年 | 尺寸 |
---|---|---|---|
添加了 2 个节点,设置了 6 个属性,添加了 2 个标签 | |||
|
|
|
|
|
|
|
|
请注意,name
是STRING
,因为它在输出中被引号括起来。第三列将长度输出STRING
为size
。长度仅计算外部引号之间的内容,而不计算引号本身。
检查源数据质量
如果导入失败,需要检查一些元素以确保源文件未损坏。
-
标题不一致 — CSV 标题可能与数据不一致。标题可能缺失、列数过多或分隔符不同。验证标题是否与文件中的数据匹配。调整格式、分隔符或列。
-
多余或缺失的引号 — 非引号文本中间的独立双引号或单引号,或引号文本中未转义的引号,都可能导致读取文件时出现问题。请转义或删除多余的引号。请参阅引号转义。
-
特殊字符或换行符 — 处理文件中的特殊字符时,请确保将其括起来或将其删除。
-
不一致的换行符 ——确保整个文件的换行符一致。
-
二进制零、BOM 字节顺序标记和其他非文本字符 — 不常见的字符或特定于工具的格式有时会隐藏在应用程序工具中,但在纯文本编辑器中却会显现出来。如果您在文件中遇到这些类型的字符,请将其删除或使用 Cypher 的规范化功能。
导入前检查源文件
在将数据导入数据库之前,您可以用来LOAD CSV
检查源文件并了解导入的数据将具有何种形式。
// Assert correct line count
LOAD CSV FROM 'https://data.neo4j.com/importing-cypher/persons.csv' AS line
RETURN count(*);
数数(*) |
---|
1 行 |
|
// Check first 5 line-sample with header-mapping
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/persons.csv' AS line
RETURN line.person_tmdbId, line.name
LIMIT 5;
line.person_tmdbId | 线路名称 |
---|---|
5 行 | |
|
|
|
|
|
|
|
|
|
|
例子
// Clear data
MATCH (n) DETACH DELETE n;
// Create constraints
CREATE CONSTRAINT Person_tmdbId IF NOT EXISTS
FOR (p:Person) REQUIRE p.tmdbId IS UNIQUE;
CREATE CONSTRAINT Movie_movieId IF NOT EXISTS
FOR (m:Movie) REQUIRE m.movieId IS UNIQUE;
// Create person nodes
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/persons.csv' AS row
MERGE (p:Person {tmdbId: toInteger(row.person_tmdbId)})
SET p.name = row.name, p.born = date(row.born);
// Create movie nodes
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/movies.csv' AS row
MERGE (m:Movie {id: toInteger(row.movieId)})
SET
m.title = row.title,
m.imdbId = toInteger(row.movie_imdbId),
m.languages = split(row.languages, '|'),
m.genres = split(row.genres, '|');
// Create relationships
LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/acted_in.csv' AS row
MATCH (p:Person {tmdbId: toInteger(row.person_tmdbId)})
MATCH (m:Movie {id: toInteger(row.movieId)})
MERGE (p)-[r:ACTED_IN]->(m)
SET r.role = row.role;
// Set additional node label
MATCH (p:Person)-[:ACTED_IN]->()
WITH DISTINCT p
SET p:Actor;
Added 1 constraints
Added 1 constraints
Added 444 nodes, Set 1332 properties, Added 444 labels
Added 93 nodes, Set 465 properties, Added 93 labels
Created 372 relationships, Set 372 properties
Added 353 labels
随着数据量的增加,首先创建所有节点,然后再通过第二遍添加关系 会更有效率。 |
导入数据的其他方式
还有一些其他工具可以将 CSV 数据导入 Neo4j。
-
该neo4j-admin database import命令是导入大型 CSV 文件最有效的方法。
-
使用语言库解析 CSV 数据并针对 Neo4j 数据库运行创建 Cypher 查询。作为扩展库创建,为开发人员提供常用程序和功能。此库对于复杂的转换和数据操作特别有用。有用的程序包括 apoc.load.jdbc、apoc.load.json 等。
-
ETL 工具:允许从关系数据库中提取模式并将其转换为图形模型。然后负责将数据导入 Neo4j。
-
Kettle导入工具映射并执行数据处理流程的步骤,非常适合非常大的数据集,特别是如果您已经熟悉使用此工具。