热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

一、neo4j-admin简要介绍neo4j-admin是管理neo4jDBMS的主要工具之一,是一种命令行工具。neo4jadmin命令需与当前neo4j用户一


一、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:指节点属性和节点ID,其他字段如LABEL等省略name;
  • field_type:指字段类型,例如:ID、LABEL等。

(1)其他要求


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

(2) 建议


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

3.1 节点文件格式

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



, , , ..., <:LABEL>


  • nodeId:ID&#xff1a;自定义的节点编号&#xff0c;对于每个节点这个编号是唯一的&#xff0c;用于创建关系等后续import操作时索引到指定节点&#xff1b;
  • propertyNameX&#xff1a;节点属性&#xff0c;对于属性&#xff0c;field_type指data_type&#xff0c;默认为string&#xff0c;可定义的data_type如下表所示&#xff1b;
  • :LABEL&#xff1a;&#xff08;注意前面有冒号&#xff0c;省略了name&#xff09;非必选&#xff0c;用于指定节点的标签&#xff0c;1个节点可以有多个标签&#xff0c;赋值时多个标签之间用该CSV文件的分隔符隔开&#xff0c;默认为“&#xff1b;”。


属性可定义的data_type&#xff08;field_type&#xff09;:
数值类int, long, float, double
布尔值boolean
字符类byte, short, char, string
点类型point
日期时间date, localtime, time, localdatetime, datetime, duration

    例1&#xff1a;movies.csv&#xff0c;文件内容如下&#xff1a;

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个&#xff08;电影&#xff09;节点&#xff1a;


  • 节点1&#xff1a;ID为tt0133093&#xff0c;名字为The Matrix&#xff0c;年份为1999&#xff08;整数类型&#xff09;&#xff0c;标签为Movie&#xff1b;
  • 节点2&#xff1a;ID为tt0234215&#xff0c;名称为The Matrix Reloaded&#xff0c;年份为2003&#xff08;整数类型&#xff09;&#xff0c;标签为Movie和Sequel&#xff1b;
  • 节点3&#xff1a;ID为tt0242653&#xff0c;名字为The Matrix Revolutions&#xff0c;年份为2003&#xff08;整数类型&#xff09;&#xff0c;标签为Movie和Sequel。

    例2&#xff1a;actors_header.csv及actors.csv&#xff0c;文件内容如下&#xff1a;

actors_header.csv&#xff1a;
personId:ID,name,:LABEL

actors.csv&#xff1a;
keanu,"Keanu Reeves",Actor
laurence,"Laurence Fishburne",Actor
carrieanne,"Carrie-Anne Moss",Actor

         actors_header.csv和actors.csv定义了3个&#xff08;演员&#xff09;节点&#xff1a;


  • 节点1&#xff1a;ID为keanu&#xff0c;名字为Keanu Reeves&#xff0c;标签为Actor&#xff1b;
  • 节点2&#xff1a;ID为laurence&#xff0c;名字为Laurence Fishburne&#xff0c;标签为Actor&#xff1b;
  • 节点3&#xff1a;ID为carrieanne&#xff0c;名字为Carrie-Anne Moss&#xff0c;标签为Actor。

3.2 关系文件格式

CSV关系文件基本的表头格式为&#xff1a;



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


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

    例3&#xff1a;&#xff08;基于例1、例2&#xff09;roles_header.csv和roles.csv内容如下&#xff1a;

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定义了一类关系&#xff0c;创建了9条关系&#xff1a;


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

3.3 说明

&#xff08;1&#xff09;除name:ID、:LABEL、:START_ID、:END_ID、:TYPE外的列都被认为是属性&#xff1a;


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

&#xff08;2&#xff09;name:ID&#xff1a;该键值对的设置是为了设置全局ID用于后续查询节点时使用&#xff1a;


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

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

样例&#xff1a;

import文件夹下现有以下CSV文件&#xff1a;

&#xff08;1&#xff09;cutomers.csv

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

&#xff08;2&#xff09;products.csv

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

&#xff08;3&#xff09;orders_header.csv

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

&#xff08;4&#xff09;customer_orders_header.csv

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

&#xff08;5&#xff09;orders1.csv

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

&#xff08;6&#xff09;orders2.csv

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

&#xff08;7&#xff09;order_details.csv

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

 执行如下neo4j-admin命令&#xff1a;

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

 &#xff08;注&#xff1a;此处为了便于阅读使用分行显示&#xff0c;实际操作时不分行&#xff0c;用空格隔开&#xff09;

执行后&#xff1a;


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

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


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

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


本文参考neo4j官方文档&#xff1a;

Import - Operations Manual 

Importing CSV Data into Neo4j - Developer Guides





推荐阅读
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • 本文详细介绍了如何在项目中引入和配置KindEditor网页编辑器,包括脚本引用、初始化编辑器以及文件上传功能的实现。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 在数据库事务处理中,InnoDB 存储引擎提供了多种隔离级别,其中 READ COMMITTED 和 REPEATABLE READ 是两个常用的选项。本文详细对比了这两种隔离级别的特点和差异,不仅从理论角度分析了它们对“脏读”和“幻读”的处理方式,还结合实际应用场景探讨了它们在并发控制和性能表现上的不同。特别关注了行锁机制在不同隔离级别下的行为,为开发者选择合适的隔离级别提供了参考。 ... [详细]
  • 本文探讨了在不解压的情况下,如何高效地从包含文本文件的.gz压缩文件中查找特定字符串的方法。通过利用特定的工具和技术,可以在保持文件压缩状态的同时,快速定位和检索所需信息,提高处理大规模数据集时的效率和性能。 ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
author-avatar
wo缘相聚在空间
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有