neo4j 加载 CSV
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包含STRINGCSV 文件所在路径。 | |
该子句一次解析一行,将当前行临时存储在用 指定的变量中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和分别包含和值。函数和允许在导入这些值之前将其转换为适当的类型。bornINTEGERDATEtoInteger()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 CSVnullLOAD 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 CSVnullLOAD 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\nWindows)。 -
默认的字段分隔符是
,。使用选项 进行更改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相当于;(分号)。 |
引号转义
STRINGCSV 文件中允许使用引号,LOAD CSV读取数据时将删除引号。如果引号STRING必须包含引号字符",则有两种方法可以对其进行转义:
-
双引号 — 使用另一个引号
"来转义引号(例如,STRINGThe "Symbol"is的 CSV 编码"The ""Symbol""")。 -
带反斜杠的前缀
\— 如果配置设置dbms.import.csv.legacy_quote_escaping设为true(默认值),\则用作引号的转义字符(例如,STRINGThe "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导入工具映射并执行数据处理流程的步骤,非常适合非常大的数据集,特别是如果您已经熟悉使用此工具。
更多推荐


所有评论(0)