学习LOAD CSV🚀
在使用Neo4j进行大量数据导入的时候,发现如果用代码自动一行一行的导入效率过低,因此明白了为什么需要用到批量导入功能,在Neo4j中允许批量导入CSV文件格式,刚开始从网上的中看了各种半残的博客或者视频,拼拼凑凑也实现了功能,然后想写个博客记录一下,一想直接把代码沾上来讲的也不是很全面,就打算按照官方文档的思路讲一下,然后给中间补充一些文档中往往会省略的实践细节,故有了这篇博客,在对官方文档的翻译中加入自己对技术的理解会比机翻或者要求严格的文档更好理解一些。本文只介绍前几个常用的节点和关系的批量导入不然内容太多了,后面不常用的就先不介绍了。
阅读本文需要对Neo4j的基础知识有一些了解,如果还没有学习,可以阅读本文章的前置文章。
Neo4j 新手教程 环境安装 基础增删改查 python链接 常用操作 纯新手向
文章目录
- 学习LOAD CSV🚀
- 1.LOAD CSV 简介
- 2. Import CSV data into Neo4j 把CSV导入Neo4j 极简版(重要)
- 3.Import compressed CSV files 导入压缩的csv文件
- 4.Import data from relational databases 导入关联数据(重要)
- 结束
首先给出Neo4j的官方文档的地址:
https://neo4j.com/docs/cypher-manual/current/clauses/load-csv/
1.LOAD 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
后面接一个文件所在路径的字符串- 命令是一行一行处理文件的,每次处理的时候,用AS将这一行的数据临时存储在一个变量里(在这个例子中这个变量是row)
- 用MERGE访问row变量然后存入到数据集中
LOAD CSV 支持本地和远程的URL,本地路径关联在Neo4j的数据库的文件夹中。
URL Uniform Resource Locator
雅称:统一资源定位符
俗称:文件路径(新手可以直接这吗理解,虽然严格意义不准确)
2. Import CSV data into Neo4j 把CSV导入Neo4j 极简版(重要)
可以将CSV文件保存在本地数据集的文件夹import下面,然后使用一个file:///
前缀名字。下面是官方给的一个例子,接下来我们具体实际操作一下
首先是保存这个csv文件,首先我们直接来一个简单的txt直接过去,之后再做用excel转的,直接新建一个txt然后粘进去。
1,ABBA,1992
2,Roxette,1986
3,Europe,1979
4,The Cardigans,1992
然后点右上角的文件选择另存为,然后进入到Neo4j的import文件夹的目录下
之后把文件后缀的txt直接改为csv,然后确认一下文件编码为UTF-8
然后打开该目录你会看到一个csv文件
用excel打开看一眼,嗯!
然后打开Neo4j的控制台。在上方的命令框输入命令
LOAD CSV FROM 'file:///artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN
a.name,
a.year
如果不知道如何打开请移步愚作:Neo4j 新手教程 环境安装 基础增删改查 python链接 常用操作 纯新手向
按下Ctrl+Enter或者右上侧的蓝色小三角运行命令,运行结果如下,导入成功。
如果不想保存到数据库文件的import文件夹下,直接换成本地路径直接导入,例如直接把文件复制到E盘,然后把路径直接换成E:/artists.csv
结果是不行。
为了解决这个问题需要求改Neo4j数据库的配置文件,首先在数据库的conf文件下下找到neo4j.conf
文件然后用记事本打开。
找到这个serve.directories.import=import
给它前面加一个#号注释掉
注释之后变成这样
然后Ctrl+S保存一下,或者关闭的时候点一下也行,然后把E:/artists.csv
改成'file:///E:/artists.csv'
然后再运行,成功!
file:///
必须加,不加报错- 在配置文件中注释了
server.directories.import=import
之后,把路径设置回file:///artists.csv
,也依旧可以从Import文件下下导入文件
LOAD CSV FROM 'file:///E:/artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN
a.name,
a.year
3.Import compressed CSV files 导入压缩的csv文件
LOAD CSV
也可以上传压缩成ZIP的CSV文件,不管套了几个文件,最后这个ZIP文件里只能有一个CSV文件,文档里写的太官方,我这里尝试重新描述一下,然后再给它分几种情况测一测,挖一挖它这个功能。
好现在import文件下直接右键CSV
压缩一层得到一个zip压缩包
然后再Neo4j控制台导入OK成功
LOAD CSV FROM 'file:///artists.zip' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN
a.name,
a.year
然后将压缩文件从import目录移动到E盘,然后运行OK
LOAD CSV FROM 'file:///E:/artists.zip' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN
a.name,
a.year
然后开始套娃
首先套了两层文件
然后将套娃文件打包成zip
然后运行ok可行
接下来套娃的时候把套娃的文件夹名字修改一下,先修改一下套娃中间文件夹的名字,给它改成a再打包再运行
OK可行
然后把套娃最外层的文件夹的名字改了,改成和CSV文件的名字不一致,然后打包成zip
这个不可行
然后把最外层的文件夹名字改成和CSV一致,然后在artist.csv在路径下加一些奇奇怪怪的文件,然后再打包成zip然后运行
可行
然后在路径下加个其他的csv文件,然后再打包成csv然后运行
OK可行
结论:和文档中的描述基本一致,就说最外层文件夹的名字得和要导入的csv文件一致,最外层文件夹名字是哪个就读哪个CSV
桀桀桀!感受到中国算法工程师的执着了吗Neo4j的官方人员(笑)。
4.Import data from relational databases 导入关联数据(重要)
在官方文档中给了这样一个例子,一个数据和其作者的数据集,那这里不但包含着作者和书籍的节点node,还包含着A作者写了B书的一个关系relationship
接下来老操作,直接复制到txt文件然后给它转存成UTF-8编码的csv,文件名字是books,要是忘了咋操作或者跳读到这的话,翻回到上面的这里。
Import CSV data into Neo4j 把CSV导入Neo4j 极简版
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
ok好的看一下,然后右侧的这个时间是缩略了,展开就能看见了不用害怕。
// Create `Book` nodes 导入节点
LOAD CSV WITH HEADERS FROM 'file:///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 'file:///books.csv' AS row
MATCH (a:Author{name: row.author})
MATCH (b:Book{id: row.id})
MERGE (a)-[:WROTE]->(b);
这段代码使用了Cypher查询语言来处理两个主要任务:
首先,它从一个CSV文件中导入数据来创建Book和Author节点;
其次,它基于相同的CSV文件创建这些Book和Author节点之间的WROTE关系。下面是对这两个过程的详细解释:
第一部分:创建Book和Author节点
LOAD CSV WITH HEADERS FROM 'file:///books.csv' AS row
MERGE (b:Book {id: row.id, title: row.title})
MERGE (a:Author {name: row.author});
LOAD CSV WITH HEADERS FROM 'file:///books.csv' AS row
这条命令告诉Neo4j从给定的路径file:///books.csv'
加载一个CSV文件,该文件具有标题行(即每列的第一行包含列名)。AS row表示每一行数据都会被赋予变量名row,之后可以通过这个变量访问行中的数据。MERGE (b:Book {id: row.id, title: row.title})
:MERGE命令用于创建一个新的Book节点,或者如果具有相同id和title属性的节点已经存在,则匹配(不重复创建)该节点。这里,row.id和row.title是从CSV文件中读取的每一行的对应列数据。MERGE (a:Author {name: row.author})
:类似地,这条命令用于创建或匹配一个Author节点,其name属性由当前行的author列提供。
第二部分:创建WROTE关系
LOAD CSV WITH HEADERS FROM 'file:///books.csv' AS row
MATCH (a:Author{name: row.author})
MATCH (b:Book{id: row.id})
MERGE (a)-[:WROTE]->(b);
- 加载数据部分一样
MATCH (a:Author{name: row.author})和MATCH (b:Book{id: row.id})
:这两个MATCH命令分别用于查找当前行中提到的Author和Book节点。它们通过比较name和id属性与文件中的相应列来定位节点。MERGE (a)-[:WROTE]->(b)
:最后,MERGE命令用来创建一个新的WROTE关系,从找到的Author节点指向Book节点。如果这样的关系已经存在,则不会创建重复的关系。
然后运行上诉代码这里我把URL改成本地了,而文档中用的是网络URL,这里还是先了解怎么在本地导入节点和关系网络导入暂时不需要
然后点一下这个WROTE,ok完美
结束
然后文档的后面还有一些增加属性以及处理数据例如去除Null值等诸如此类的工作,不是重点暂时就先不介绍了。然后有个小麻烦的地方,在导入不同类别的数据的时候需要分批导入,类别参数不能直接用CSV中的导入值,我自己有个数据集有50类关系,我手动输入了50次命令,我简单了解了一下之后应该可以用Foreach命令解决,这个问题会纳入到后续的更新规划当中。