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

导入本地文件

在 Aura 上不可用

您可以将 CSV 文件存储在数据库服务器上,然后使用 URL 访问它们file:///。默认情况下,路径是相对于 Neo4j 导入目录解析的。

示例 1. 从本地文件导入艺术家姓名和年份信息
艺术家.csv
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 个标签

'ABBA'

'1992'

'Roxette'

'1986'

'Europe'

'1979'

'The Cardigans'

'1992'

有关将数据导入 Aura 实例的方法,请参阅Aura → 导入数据
使用file:///URL 时,空格和其他非字母数字字符必须进行URL 编码
文件 URL 的配置设置

dbms.security.allow_csv_import_from_file_urls

此设置决定是否file:///允许 URL。

服务器.目录.导入

file:///此设置设置了相对于其解析 URL 的根目录。

从远程位置导入

您可以从远程路径上托管的 CSV 文件导入数据。

LOAD CSV支持通过 HTTPS、HTTP 和 FTP(有或无凭证)访问 CSV 文件。它还可以遵循重定向,但更改协议的重定向除外(出于安全原因)。

示例 2. 通过 HTTPS 从远程文件导入艺术家姓名和年份信息
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 个标签

'ABBA'

'1992'

'Roxette'

'1986'

'Europe'

'1979'

'The Cardigans'

'1992'

示例 3. 使用凭证通过 FTP 从远程文件导入艺术家姓名和年份信息
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 个标签

'ABBA'

'1992'

'Roxette'

'1986'

'Europe'

'1979'

'The Cardigans'

'1992'

从云 URI 导入

企业版在 Aura 上不可用
从 Google Cloud Storage URI 导入
在 5.21 中引入

您可以从托管在 Google Cloud Storage URI 中的 CSV 文件导入数据。

示例 4. 从 Google Cloud Storage URI 导入艺术家姓名和年份信息
gs://gs-bucket/artists.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 个标签

'ABBA'

'1992'

'Roxette'

'1986'

'Europe'

'1979'

'The Cardigans'

'1992'

从 AWS S3 URI 导入
在 5.19 中引入

您可以从托管在 AWS S3 URI 中的 CSV 文件导入数据。

示例 5.从 AWS S3 URI 导入艺术家姓名和年份信息
s3://aws-bucket/artists.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 个标签

'ABBA'

'1992'

'Roxette'

'1986'

'Europe'

'1979'

'The Cardigans'

'1992'

导入压缩的 CSV 文件

LOAD CSV可以读取使用 ZIP 或 gzip 压缩的本地 CSV 文件。ZIP 档案可以具有任意目录结构,但只能包含单个 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节点,并将其与关系分开。

示例 6.从单个 CSV 文件导入

源文件books.csv包含作者和书籍的信息。从图的角度来看,这些是具有不同标签的节点,因此需要不同的查询来加载它们。

该示例对该文件执行多次LOAD CSV,每次执行均侧重于创建一个实体类型。

书籍.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
示例 7.从多个 CSV 文件导入

acted_in.csv文件包含有关演员与其所演电影之间关系的数据(来自persons.csvmovies.csvperson_tmdbId )。演员和电影通过他们的 ID 列和链接在一起movieId

该文件还包含演员在电影中扮演的角色,并将其作为关系属性导入 Neo4j。

行动.csv
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 中的节点可以同时标记为DogActor,而在关系模型中,狗和演员是独立的实体。

导入关系数据集后,可能还会根据用例添加更多标签。如果在查询中使用其他标签,则可以加快节点的定位速度。

示例 8.在节点上添加额外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 ®函数对其进行处理。

示例 9.导入数字和时间数据

文件中persons.csv 的person_tmdbId和分别包含和值。函数和允许在导入这些值之前将其转换为适当的类型。bornINTEGERDATEtoInteger()date()

人员.csv
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 个标签

'Harrison Ford'

3

1942-07-13

'Tom Hanks'

31

1956-07-09

'Robin Wright'

32

1966-04-08

'Sally Field'

35

1946-11-06

'Sean Bean'

48

1959-04-17

有关类型转换函数的列表,请参阅转换数据值

处理null

Neo4j 不存储null。 null可以跳过 CSV 文件中的某些字段或用默认值替换这些字段LOAD CSV

null示例 10. 处理带有值的文件

在文件中companies.csv,有些行没有为某些列指定值。示例显示了如何处理null值的几种选项。

公司.csv
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")})
将空值更改STRINGnull值(未存储)
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元素转换为列表。

示例 11. 将电影语言和类型解析为列表

文件movies.csv包含一个标题行和总共94行。

languagesgenres包含列表式的值。两者之间用竖线分隔|split()允许在将它们插入数据库之前将它们制作成 Cypher 列表。

电影.csv
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 个标签

'Toy Story'

114709

['English']

['Adventure', 'Animation', 'Children', 'Comedy', 'Fantasy']

'Jumanji'

113497

['English', 'French']

['Adventure', 'Children', 'Fantasy']

'Grumpier Old Men'

113228

['English']

['Comedy', 'Romance"]

'Waiting to Exhale'

114885

['English']

['Comedy', 'Romance', 'Drama']

'Father of the Bride Part II'

113041

['English']

['Comedy']

有关更多STRING操作函数,请参阅字符串函数

建议

创建唯一性约束

导入数据之前,请务必创建唯一性约束,以避免重复或冲突实体。如果源文件包含重复数据且存在正确的约束,Cypher 会引发错误。

示例 12.根据人员 ID创建节点属性唯一性约束
人员.csv
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
...
对人员 ID 创建节点属性唯一性约束
CREATE CONSTRAINT Person_tmdbId IF NOT EXISTS
FOR (p:Person) REQUIRE p.tmdbId IS UNIQUE
结果
Added 1 constraints

处理大量数据

LOAD CSV包含大量行(接近数十万或数百万)的文件可能会遇到内存问题。对于大型文件,建议通过子句将导入过程拆分为几个较轻的事务CALL {…​} IN TRANSACTIONS

示例 13. 在多个事务中加载大型 CSV 文件

文件persons.csv包含一个标题行,总共 869 行。示例加载了200 行交易中的name和列。born

人员.csv
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。

例 14.linenumber()
艺术家.csv
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 行

1

["1","ABBA","1992"]

2

["2","Roxette","1986"]

3

["3","Europe","1979"]

4

["4","The Cardigans","1992"]

使用以下方式访问 CSV 文件路径file()

该函数提供正在操作的file()文件的绝对路径,或者在上下文之外调用。LOAD CSVnullLOAD CSV

例 15.file()
艺术家.csv
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您必须通过添加到查询来指示标题行的存在。然后,您可以通过相应的列名访问特定字段。

示例 16. 将 CSV 解析为地图列表
艺术家与标题.csv
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 个标签

"ABBA"

1992

"Roxette"

1986

"Europe"

1979

"The Cardigans"

1992

字段分隔符

默认字段分隔符为,。使用该FIELDTERMINATOR选项可指定不同的字段分隔符。

如果您尝试导入未使用,字段分隔符的文件并且也未指定自定义分隔符,LOAD CSV则会将 CSV 解释为具有单列。

;示例 17. 使用字段分隔符导入 CSV
艺术家-fieldterminator.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必须包含引号字符",则有两种方法可以对其进行转义:

  1. 双引号 — 使用另一个引号"来转义引号(例如,STRING The "Symbol"is的 CSV 编码"The ""Symbol""")。

  2. 带反斜杠的前缀\ — 如果配置设置dbms.import.csv.legacy_quote_escaping设为true(默认值),\则用作引号的转义字符(例如,STRING The "Symbol"is的 CSV 编码"The \"Symbol\"")。

示例 18.导入带双引号转义的 CSV
带有转义引号的艺术家.csv
"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 个标签

1

'The "Symbol"'

1992

12

2

'The "Symbol"'

1992

12

请注意,nameSTRING,因为它在输出中被引号括起来。第三列将长度输出STRINGsize。长度仅计算外部引号之间的内容,而不计算引号本身。

检查源数据质量

如果导入失败,需要检查一些元素以确保源文件未损坏。

  • 标题不一致 — CSV 标题可能与数据不一致。标题可能缺失、列数过多或分隔符不同。验证标题是否与文件中的数据匹配。调整格式、分隔符或列。

  • 多余或缺失的引号 — 非引号文本中间的独立双引号或单引号,或引号文本中未转义的引号,都可能导致读取文件时出现问题。请转义或删除多余的引号。请参阅引号转义

  • 特殊字符或换行符 — 处理文件中的特殊字符时,请确保将其括起来或将其删除。

  • 不一致的换行符 ——确保整个文件的换行符一致。

  • 二进制零、BOM 字节顺序标记和其他非文本字符 — 不常见的字符或特定于工具的格式有时会隐藏在应用程序工具中,但在纯文本编辑器中却会显现出来。如果您在文件中遇到这些类型的字符,请将其删除或使用 Cypher 的规范化功能

导入前检查源文件

在将数据导入数据库之前,您可以用来LOAD CSV检查源文件并了解导入的数据将具有何种形式。

示例 19. 断言正确的行数
// Assert correct line count
LOAD CSV FROM 'https://data.neo4j.com/importing-cypher/persons.csv' AS line
RETURN count(*);
结果
数数(*)

1 行

445

示例 20. 使用 header 抽样检查前五行
// 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 行

'3'

'Harrison Ford'

'31'

'Tom Hanks'

'32'

'Robin Wright'

'35'

'Sally Field'

'48'

'Sean Bean'

例子

删除当前数据库并导入完整电影数据集
// 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;
查看全部(20 多行)
结果
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。

  1. neo4j-admin database import命令是导入大型 CSV 文件最有效的方法。

  2. 使用语言库解析 CSV 数据并针对 Neo4j 数据库运行创建 Cypher 查询。作为扩展库创建,为开发人员提供常用程序和功能。此库对于复杂的转换和数据操作特别有用。有用的程序包括 apoc.load.jdbc、apoc.load.json 等。

  3. ETL 工具:允许从关系数据库中提取模式并将其转换为图形模型。然后负责将数据导入 Neo4j。

  4. Kettle导入工具映射并执行数据处理流程的步骤,非常适合非常大的数据集,特别是如果您已经熟悉使用此工具。

neo4j LOAD CSVNeo4j数据库中的一个功能,用于从CSV文件中读取数据并将其加载数据库中。它可以通过两种方式来指定CSV文件的路径:相对路径和绝对路径。 相对路径是相对于Neo4j数据库的安装路径的路径。一种常见的方式是使用LOAD CSV语句,其中指定了一个相对路径,例如从<NEO4J_HOME>/import/ceshi.csv读取数据。 另一种方式是使用绝对路径来指定CSV文件的完整路径,例如D:/neo4j/neo4j-community-4.4.18/import/ceshi/ceshi.csv。 此外,还有一个名为neo4j-csv-firehose的项目,它可以将其他数据源实时转换为CSV文件,并通过LOAD CSV命令将其输入到Neo4j数据库中。这个项目使用gradle作为构建系统,并提供了将其他数据源转换为CSV的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Neo4j---(3)批量导入实体和关系csv文件之LOAD CSV](https://blog.csdn.net/m0_69483514/article/details/131488206)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [neo4j-csv-firehose](https://download.csdn.net/download/weixin_42165583/18620707)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京橙溪 www.enwing.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值