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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest测试框架使用基础07 fixture—parametrize获取参数的几种常用形式

【pytest】parametrize获取参数的几种常用形式: a.数据结构 b.文件 c.数据库 d.conftest.py配置一、直接在标签上传参 1.1 一个参数多个值 pytest.mark.parametrize("参数", (参数值1, 参数值2, 参数值3))示例: import pytest # 单个参数的情况 pytest.…

每日OJ题_牛客另类加法_力扣不用加号的加法

目录 另类加法 不用加号的加法 另类加法 另类加法__牛客网 class UnusualAdd {public:int addAB(int A, int B) {while (B ! 0) {int C ((B & A) << 1); // 进位A ^ B; // 无进位相加B C; // 直到进位不为0就跳出循环}return A;} };不用加号的加法 面试题 17.0…

C++鸟瞰(个人心得)

头文件 C和C一样&#xff0c;在源文件的头部需要加入头文件&#xff0c;来告诉预处理器你需要用到什么库。编写方式也和C语言一样&#xff0c;不过基础头文件不是stdlib.h而是iostream&#xff0c;名字划分为io和stream。 stream翻译过来就是“流”的概念&#xff0c;流的概念…

WebSocket:实现客户端与服务器实时通信的技术

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

3、Design Script之对象类型

布尔值 布尔值Boolean——true/false是Design Script的常量对象&#xff0c;用于表示真/假值 boolTrue true; boolFalse false&#xff1b; 在数字环境中&#xff0c;布尔值的行为类似于整数0和1 布尔值也可以作为Yes和No来引用 数字 int(integer)——整数 Double&#…

JS的对象

目录 对象&#xff1a;object 对象的创建&#xff1a; 利用对象字面量创建对象&#xff1a; 使用new来进行创建对象&#xff1a; 利用构造函数来创建对象&#xff1a; new的执行&#xff1a; 对象属性的遍历&#xff1a;for in ------ 相当于JAVA的工具类&#xff0c;直…

docker学习入门篇

1、docker简介 docker官网&#xff1a; www.docker.com dockerhub官网&#xff1a; hub.docker.com docker文档官网&#xff1a;docs.docker.com Docker是基于Go语言实现的云开源项目。 Docker的主要目标是&#xff1a;Build, Ship and Run Any App, Anywhere(构建&…

每日一题——LeetCode2129.将标题首字母大写

方法一 个人方法 将字符串转为数组&#xff0c;遍历数组&#xff0c;对数组的每一个元素&#xff0c;先全部转为小写&#xff0c;如果当前元素长度大于2&#xff0c;将第一个字符转为大写形式 var capitalizeTitle function(title) {titletitle.split( )for(let i0;i<tit…

概要了解postman、jmeter 、loadRunner

postman还蛮好理解的&#xff0c;后续复习的话着重学习关联接口测试即可&#xff0c;感觉只要用几次就会记住&#xff1a; 1 从接口的响应结果当中提取需要的数据 2 设置成环境变量/全局变量&#xff08;json value check 、set environment para 3写入到下一个接口的请求数据中…

工具-百度云盘服务-身份认证

目标 通过百度网盘API的方式去获取网盘中的文件&#xff0c;要实现这的第一步就是需要获取网盘的权限。资料(参考) 如果期望应用访问用户的网盘文件&#xff0c;则需要经过用户同意&#xff0c;这个流程被称为“授权”。百度网盘开放平台基于 OAuth2.0 接入授权。OAuth2.0 是…

1688 API商品详情接口与ERP系统的集成

API接口与ERP系统集成的应用主要包括数据同步、业务流程自动化和信息共享三个方面。 数据同步&#xff1a;通过API接口&#xff0c;ERP系统可以与其他系统之间进行数据的交换和同步。比如&#xff0c;将销售订单从电商平台自动导入到ERP系统中&#xff0c;然后将发货信息同步回…

Kettle安装使用手册

Kettle安装使用手册 目录 1 KETTLE 介绍 5 1.1. 核心组件 5 1.2. 组成部分 5 1.3. 概念模型 6 1.3.1. Transformation(转换) 6 1.3.2. Steps(步骤) 7 1.3.3. Hops(节点连接) 7 1.3.4. Jobs(工作) 7 1.3.5. Variable(变量) 8 1.4. 查看版本 9 1.5. 选项设置 10 2 安装…

OEKO-TEX®2024新规定于4月1日正式生效

OEKO-TEX协会参照最新的科学发现和法律法规&#xff0c;就测试标准、限量值和指南发布了年度更新。新规定将在常规过渡期结束后&#xff0c;于2024年4月1日正式生效&#xff08;PFAS限量值例外&#xff09;。新的总氟(TF)限量值取代了之前的可萃取有机氟(EOF)&#xff0c;该更新…

关于分布式分片,你该知道的事儿

关于分布式分片&#xff0c;你该知道的事儿 前言一、关于分片方式的那些事儿1.1 按照Hash划分1.2 按照区间范围划分1.3 按照数据量划分1.4 来些例子1.4.1 Redis的分片划分1.4.2 Mongo的分片划分 二、关于分区再平衡的那些事儿2.1 基于固定分片数量2.2 基于动态分片数量2.3 基于…

DevOps实战:Docker、Kubernetes与Jenkins的完美融合

DevOps与容器化技术&#xff1a;Docker、Kubernetes和Jenkins 引言 在软件开发领域&#xff0c;DevOps文化和容器化技术已经成为当今最热门的话题之一。DevOps的目标是缩短开发和运维之间的距离&#xff0c;提高软件交付的速度和质量。而容器化技术&#xff0c;如Docker和Kub…

[Affinity笔记]Affinity Photo自设快捷键笔记(附配置文件)

最近用Affinity Photo设计2D角色&#xff0c;把默认的快捷键改了一下&#xff0c;写篇笔记以作备忘 AffinityPhoto自定义快捷键 CSDN下载 图层命令 命令快捷键说明合并图层Ctrl MMerge合并所有可见图层Ctrl Shift M锁定图层Ctrl LLock解锁图层Shift L解锁全部图层Ctrl S…

计算机毕业设计 | SSM 在线毕业论文管理 线上考试成绩教务管理系统(附源码)

1&#xff0c; 绪论 研究背景 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于论文管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;首页、系统用户&#xff08;管理员、学生、老师&#xff09;模块管理&#xff08;指导教师、课…

为什么不要使用elasticsearch

互联网上有很多文章&#xff0c;都在讲为什么要使用elasticsearch&#xff0c;却很少有人讲为什么不要使用elasticsearch。作为深入研究elasticsearch四年&#xff0c;负责公司万亿级别检索的操盘手&#xff0c;借着这篇文章&#xff0c;给大家分享一下&#xff0c;为什么不要使…

单元测试框架unittest D15

1、unittest 单元测试框架 TestCase&#xff1a;一个testcase的实例就是一个测试用例 TestSuite&#xff1a;多个测试用例集合在一起。TestLoader&#xff1a;是用来加载TestCase到TestSuite中的 TextTestRunner&#xff1a;用来执行测试用例的 fixture&#xff1a;测试用例…

C++11 std::thread

std::thread std::thread是一个用于创建和管理线程的类。它可以让程序在多个并发执行的线程中执行不同的任务。下面是std::thread的一些常用用法介绍&#xff1a; 创建线程&#xff1a; void myFunction(int arg1, double arg2) {// 线程执行的代码 } std::thread t(myFunct…