草庐IT

neo4j学习笔记:使用neo4j-admin import命令批量处理CSV文件

xiaozhimonica 2023-04-05 原文

一、neo4j-admin简要介绍

neo4j-admin是管理neo4j DBMS的主要工具之一,是一种命令行工具。

neo4j admin命令需与当前neo4j用户一致。

(1)位置:以neo4j desktop为例,neo4j-admin在当前project下活动的database的dbms文件夹下的bin文件夹中。

(2)启动方式:

  • 打开当前project的terminal;
  • 进入bin文件夹:执行cd bin,此时,输入neo4j-admin XX(命令)即可。

(3)语法:neo4j-admin [-hv] [COMMAND],常用命令如下:

        注意环境和neo4j-admin 版本!

  • neo4j-admin -h 或 neo4j-admin --help:显示neo4j-admin帮助信息;
  • neo4j-admin -v 或 neo4j-admin --version:打印neo4j-admin版本信息;
  • neo4j-admin import:从一系列CSV文件中导入数据,使用详见下一节。

二、neo4j-admin import命令

(1)用途:可用于批量导入CSV数据。

(2)前提:使用者必须有权限对dbmis.directories.data 和dbms.directories.log进行写入操作。

(3)特点:仅可用于初始化未运行的空数据库创建新的数据库,即:即便一个已存在的存储过数据的数据库被清空也无法执行import命令。

(4)vs LOAD CSV:

LOAD CSV

用于将中小型CSV文件数据导入已存在的数据库

可按需执行LOAD CSV命令多次

neo4j-admin import

用于批量导入格式化的CSV文件

仅可对空数据库使用一次

注意:该命令为离线运行,即:执行该命令前数据库应处于未运行状态(关闭server),执行后许重启neo4j sever,详见下文。

(5)import 命令的使用:

neo4j-admin import  [Options]

  • Options为可选项,如有多个,用空格隔开,支持以下选项:
  1. --expand -comannds
  2. --verbose
  3. --cache-on-heap[=true/false]
  4. --force[=true/false]默认为false,如设置为true表示在导入数据前将存在的数据库文件删除,可用于需重新导入数据的场景,例如:在导入真实数据前,先导入了测试数据,打算先看看导入后数据是什么样子,那么可以设置--force=true,这样可以对同一个数据库进行重新导入;
  5. --high-io[=true/false]:默认为false,如设置为true
  6. --ignore-empty-strings[=true/false]:确定是否忽略数据空字段,默认为false
  7. --trim-strings=[true/false]:确定是否在遇到空白行时认为是null,默认为false

三、CSV格式化文件

        neo4j-admin import命令处理的CSV文件需要满足特定的格式,即CSV格式化文件,分为两类:节点文件(node files)关系文件(relationship files)。基本格式为键值对,如下:

<name>:<field_type>

  • name:指节点属性和节点ID,其他字段如LABEL等省略name;
  • field_type:指字段类型,例如:ID、LABEL等。

(1)其他要求

  • CSV文件的编码格式需为UTF-8。

(2) 建议

  • 表头单独建文件,以便处理和编辑;
  • 用文本编辑器如notepad、vscode等编辑CSV文件,不建议直接用excel或wps编辑,容易导致乱码等问题。

3.1 节点文件格式

      CSV节点文件的表头格式如下:

<nodeId:ID>, <propertyName1>, <propertyName2>, ..., <:LABEL>

  • nodeId:ID自定义的节点编号,对于每个节点这个编号是唯一的,用于创建关系等后续import操作时索引到指定节点;
  • propertyNameX节点属性,对于属性,field_type指data_type,默认为string,可定义的data_type如下表所示;
  • :LABEL注意前面有冒号,省略了name)非必选,用于指定节点的标签,1个节点可以有多个标签,赋值时多个标签之间用该CSV文件的分隔符隔开,默认为“;”。
属性可定义的data_type(field_type):
数值类int, long, float, double
布尔值boolean
字符类byte, short, char, string
点类型point
日期时间date, localtime, time, localdatetime, datetime, duration

    例1:movies.csv,文件内容如下:

movieId:ID,title,year:int,:LABEL
tt0133093,"The Matrix",1999,Movie
tt0234215,"The Matrix Reloaded",2003,Movie;Sequel
tt0242653,"The Matrix Revolutions",2003,Movie;Sequel

        movies.csv 定义了3个(电影)节点:

  • 节点1:ID为tt0133093,名字为The Matrix,年份为1999(整数类型),标签为Movie;
  • 节点2:ID为tt0234215,名称为The Matrix Reloaded,年份为2003(整数类型),标签为Movie和Sequel;
  • 节点3:ID为tt0242653,名字为The Matrix Revolutions,年份为2003(整数类型),标签为Movie和Sequel。

    例2:actors_header.csv及actors.csv,文件内容如下:

actors_header.csv:
personId:ID,name,:LABEL
actors.csv:
keanu,"Keanu Reeves",Actor
laurence,"Laurence Fishburne",Actor
carrieanne,"Carrie-Anne Moss",Actor

         actors_header.csv和actors.csv定义了3个(演员)节点:

  • 节点1:ID为keanu,名字为Keanu Reeves,标签为Actor;
  • 节点2:ID为laurence,名字为Laurence Fishburne,标签为Actor;
  • 节点3:ID为carrieanne,名字为Carrie-Anne Moss,标签为Actor。

3.2 关系文件格式

CSV关系文件基本的表头格式为:

<:START_ID>, <:TYPE>, <:END_ID>, <RelationshipPropertiesName1>,...<RelationshipPropertiesName2>

  • :START_ID关系的起始节点编号(The ID of the start node for this relationship)必须有;
  • :TYPE关系的类别(relationship types),例如:WORKS_FOR, CONTAINS...,必须有;
  • :END_ID关系的结束节点编号(The ID of the end node for this relationship),必须有;
  • RelationshipPropertiesNameX:关系的属性,非必须。
  • <:START_ID>和<:END_ID>不需要定义name,如果定义了<name>:<START_ID>或<name>:<END_ID>,则自动忽略<name>。

    例3:(基于例1、例2)roles_header.csv和roles.csv内容如下:

roles_header.csv:
:START_ID,role,:END_ID,:TYPE
roles.csv:
keanu,"Neo",tt0133093,ACTED_IN
keanu,"Neo",tt0234215,ACTED_IN
keanu,"Neo",tt0242653,ACTED_IN
laurence,"Morpheus",tt0133093,ACTED_IN
laurence,"Morpheus",tt0234215,ACTED_IN
laurence,"Morpheus",tt0242653,ACTED_IN
carrieanne,"Trinity",tt0133093,ACTED_IN
carrieanne,"Trinity",tt0234215,ACTED_IN
carrieanne,"Trinity",tt0242653,ACTED_IN

        roles_header.csv和roles.csv定义了一类关系,创建了9条关系:

  • 关系1:ID为keanu的Actor   ACTED_IN  ID为tt0133093的Movie,扮演的role为Neo;
  • 关系2:ID为keanu的Actor   ACTED_IN  ID为tt0234215的Movie,扮演的role为Neo;
  • 关系3:ID为keanu的Actor   ACTED_IN  ID为tt0242653的Movie,扮演的role为Neo;
  • 关系4:ID为laurence的Actor   ACTED_IN  ID为tt0133093的Movie,扮演的role为Morpheus;
  • 关系5:ID为laurence的Actor   ACTED_IN  ID为tt0234215的Movie,扮演的role为Morpheus;
  • 关系6:ID为laurence的Actor   ACTED_IN  ID为tt0242653的Movie,扮演的role为Morpheus;
  • 关系7:ID为carrieanne的Actor   ACTED_IN  ID为tt0133093的Movie,扮演的role为Trinity;
  • 关系8:ID为carrieanne的Actor   ACTED_IN  ID为tt0234215的Movie,扮演的role为Trinity;
  • 关系9:ID为carrieanne的Actor   ACTED_IN  ID为tt0242653的Movie,扮演的role为Trinity。

3.3 补充说明

(1)除name:ID、:LABEL、:START_ID、:END_ID、:TYPE外的列都被认为是属性

  • 如果“:”前名称省略,则该列数据读取;
  • 如果为“name:”或者为“:IGNORE”,则该列数据不读取。

(2)name:ID:该键值对的设置是为了设置全局ID用于后续查询节点时使用:

  • 如果跨实体有重复的ID编号,则需要按照“name:ID(group)”形式设置该键值对;
  • 如果定义的ID编号是全局唯一的,不需要定义group。

3.4 常见坑

(1)表头问题:表头与数据不一致,例如:缺失列、多列、表头分隔符与数据分隔符不一致等。在导入CSV文件时,提前确认表头没有这些问题将节省大量时间。

(2)引号问题:文件正文内容中引号,需要考虑转义问题。

3.5 常用数据清洗工具

(1)CSVKit:python提供一系列数据清洗和格式化工具,如csvstat、csvgrep等。

(2)CSVLint:一种线上处理CSV文件的网站,CSV Lint | Check your CSV files with CSVLint

(3) papa parse:Javascript库用于处理CSV文件。

四、使用neo4j-admin import命令批量处理CSV文件

举例说明批量处理方法:

import文件夹下现有以下CSV文件:

(1)cutomers.csv

customers.csv:
customerId:ID(Customer), name
23, Delicatessen Inc
42, Delicious Bakery

(2)products.csv

products.csv:
productId:ID(Product), name, price, :LABEL
11,Chocolate,10,Product;Food

(3)orders_header.csv

orders_header.csv:
orderId:ID(Order),date,total,customerId:IGNORE

(4)customer_orders_header.csv

customer_orders_header.csv:
:END_ID(Order),date:IGNORE,total:IGNORE,:START_ID(Customer)

(5)orders1.csv

orders1.csv:
1041,2020-05-10,130,23

(6)orders2.csv

orders2.csv:
1042,2020-05-12,20,42

(7)order_details.csv

order_details.csv:
:START_ID(Order),amount,price,:END_ID(Product)
1041,13,130,11
1042,2,20,11

 执行如下neo4j-admin命令:

../bin/neo4j-admin import --database=orders
     --nodes=Customer=import/customers.csv
     --nodes=import/products.csv
     --nodes=Order="import/orders_header.csv,import/orders1.csv,import/orders2.csv"
     --relationships=CONTAINS=import/order_details.csv
     --relationships=ORDERED="import/customer_orders_header.csv,import/orders1.csv,orders2.csv"
     --trim-strings=true

 (注:此处为了便于阅读使用分行显示,实际操作时不分行,用空格隔开)

执行后:

  1. 创建了名为orders的新数据库(--database=orders);
  2. 创建了LABEL为Customer的节点,节点文件为customers.csv:节点1:ID(编号)为23,name(属性名称)为Delicatessen Inc;节点2:ID(编号)为42,name(属性名称)为Delicious Bakery;这里表头customerId:ID(Customer)的Customer定义了该节点的group为Customer,目的是防止在跨实体查询节点编号时有重复的ID编号。
  3. 创建了LABEL为Product和Food的节点(LABEL定义来自products.csv的表头),节点文件为products.csv,节点1:ID(编号)为11,name(属性:名称)为Chocolate,price(属性:价格)为10。
  4. 创建了LABEL为Order的节点,节点文件为orders_header.csv、orders1.csv、orders2.csv,节点1:ID(编号)为1041,date(属性:日期)为2020-05-10,total(属性:总数)为130;节点2:ID(编号)为1042,date(属性:日期)为2020-05-12,total(属性:总数)为20。:IGNORE列表示省略(该列设置的目的是为了对应orders1.csv和orders2.csv的数据列,这两个文件被重复使用)
  5. 创建了关系类型Type为CONTAINS的关系,关系文件为orders_details.csv,关系1:START_ID(起始节点编号)为group为Order的1041,END_ID(结束节点编号)为group为Product的11,amount(属性:数量)为13,price(属性:价格)为130;关系2:START_ID(起始节点编号)为group为Order的1042,END_ID(结束节点编号)为group为Product的11,amount(属性:数量)为2,price(属性:价格)为20。
  6. 创建了关系类型Type为ORDERED的关系,关系文件为customer_orders_header.csv、orders1.csv、orders2.csv,关系1:START_ID(起始节点编号)为group为Customer的23,END_ID(结束节点编号)为group为Order的1041,关系无属性;关系2:START_ID(起始节点编号)为group为Customer的42,END_ID(结束节点编号)为group为Order的1042,无其他关系属性。
  7. 设置trim-strings=true表示:如字符串值为空白行,则认为该值为null。

五、导入后在neo4j browser/desktop查询数据

  1. 使用neo4j-admin import前关闭server;
  2. 执行neo4j-admin import命令,database=dbName,确认导入成功;
  3. 打开neo4j browser/desktop server;
  4. 创建与database名称相同的数据库(即执行:create database dbName),切换到该数据库(dbName)后即可使用查询语句。

参考:Re: Neo4j-admin import successful but no data show... - Neo4j - 13384neo4j import显示成功但是查询没有数据_mydoubts的博客-CSDN博客_neo4j导入csv文件成功但查不到数据

本文参考neo4j官方文档:

Import - Operations Manual

Importing CSV Data into Neo4j - Developer Guides

有关neo4j学习笔记:使用neo4j-admin import命令批量处理CSV文件的更多相关文章

  1. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby CSV : How can I read a tab-delimited file? - 2

    CSV.open(name,"r").eachdo|row|putsrowend我得到以下错误:CSV::MalformedCSVErrorUnquotedfieldsdonotallow\ror\n文件名是一个.txt制表符分隔文件。我是专门做的。我有一个.csv文件,我转到excel,并将文件保存为.txt制表符分隔的文件。所以它是制表符分隔的。CSV.open不应该能够读取制表符分隔的文件吗? 最佳答案 尝试像这样指定字段分隔符:CSV.open("name","r",{:col_sep=>"\t"}).eachdo|row|

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. ruby - 如何使用 Ruby 将 CSV 文件读入 HTML 表格? - 2

    我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda

  8. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  9. ruby-on-rails - 使用 RSpec 测试 CSV.generate - 2

    我在Rails3.1项目中有以下助手-我只是想知道是否有办法测试CSV.generate调用。我很想说我知道如何去做,但事实是我什至不知道从哪里开始。任何想法表示赞赏。require'csv'moduleAdmin::PurchasesHelperdefcsv_purchase_listcolumns=['course','amount','first_name','last_name','contact_phone','contact_mobile','created_at']CSV.generate(:col_sep=>";",:row_sep=>"\r\n",:headers=>

  10. ruby - 如何从 ARGF 读取 csv - 2

    在Ruby1.9中,我如何从ARGF中读取CSV?我尝试了以下方法,但没有打印任何内容:require'csv'CSV(ARGF).readdo|row|prowendhttp://www.ruby-doc.org/core-1.9.3/ARGF.htmlhttp://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html 最佳答案 如果你想偷懒你可以试试:CSV.new(ARGF.file).eachdo|row|...end来源:http://www.ruby-doc.org/std

随机推荐