当前位置: 首页 > news >正文

Neo4j 批量导入数据 从官方文档学习LOAD CSV 命令 小白可食用版

学习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])})
RETURNa.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])})
RETURNa.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])})
RETURNa.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])})
RETURNa.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命令解决,这个问题会纳入到后续的更新规划当中。

相关文章:

  • PHP+Lunix+GIT 如何快速使用宝塔WebHook快速自动化部署
  • C++训练营:引用传递
  • 计算机服务器中了devos勒索病毒怎么解密,devos勒索病毒解密工具流程
  • 【计算机网络教程】第一章课后习题答案
  • Websocket在Asp.net webApi(.net framework)上的应用
  • JAVA后端开发面试基础知识(九)——SpringBoot
  • 机器学习模型—逻辑回归
  • Win11系统启动VMware上虚拟机蓝屏解决办法
  • 十步打造JAVA应用服务器
  • go docker sdk 使用 第二章
  • ubuntu 23.04 安装 中文输入法
  • Unity3d Shader篇(十四)— 卡通着色
  • GPT与R 在生态环境领域数据统计分析
  • python中的排序函数用法:A.sort(key=lambda x: abs(x), reverse=True)
  • 力扣654. 最大二叉树
  • 自己简单写的 事件订阅机制
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Android组件 - 收藏集 - 掘金
  • C语言笔记(第一章:C语言编程)
  • Less 日常用法
  • Mithril.js 入门介绍
  • MySQL QA
  • mysql常用命令汇总
  • orm2 中文文档 3.1 模型属性
  • 关于extract.autodesk.io的一些说明
  • 基于Android乐音识别(2)
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 昨天1024程序员节,我故意写了个死循环~
  • ​flutter 代码混淆
  • (5)STL算法之复制
  • (done) 两个矩阵 “相似” 是什么意思?
  • (LeetCode C++)盛最多水的容器
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (三)模仿学习-Action数据的模仿
  • (十八)三元表达式和列表解析
  • (四)鸿鹄云架构一服务注册中心
  • (五)Python 垃圾回收机制
  • (轉貼) UML中文FAQ (OO) (UML)
  • .NET 发展历程
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .Net 垃圾回收机制原理(二)
  • .NET开源项目介绍及资源推荐:数据持久层
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [CentOs7]iptables防火墙安装与设置
  • [flask]http请求//获取请求头信息+客户端信息
  • [LWC小知识] 标准lightning-input-field怎么取得变更值(onchange)
  • [Oh My C++ Diary]\t \n \r的用法
  • [one_demo_2]使用正则表达式过滤字符串
  • [rancher] rancher部署和使用的一些思考