我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

neo4j图数据库,是如何导入既有的csv文件的呢?其实根据csv文件的基本情况,也有不同的方案可选。可以通过neo4j-admin导入数据库,也可以使用cypherload csv功能导入数据库。两者适用的情况有所不同,大家按需取用。

苏南大叔:neo4j图数据库,如何使用cypher语句直接导入csv文件? - neo4j-load-csv
neo4j图数据库,如何使用cypher语句直接导入csv文件?(图7-1)

大家好,这里是苏南大叔的平行空间笔记本博客,这里记录苏南大叔和计算机代码的故事。本文主要讲述neo4jload csv功能,通过load识别csv中的数据,然后简要加工导入。本文测试环境:win10neo4j社区版@4.4.6java@11.0.14

csv文件数据

进入本文的正题,neo4j是如何使用load csv导入csv数据的呢?本文的龙套演员是neo4j自带的northwind数据。这一系列数据共有五个文件,这里选取products.csvcategories.csvsuppliers.csv文件作为例子。文件地址:

数据结构如下图所示:

苏南大叔:neo4j图数据库,如何使用cypher语句直接导入csv文件? - csv文件数据结构
neo4j图数据库,如何使用cypher语句直接导入csv文件?(图7-2)

本文将完整导入products.csvcategories.csv,并对其建立关系联系。然后,不使用with headers方式导入suppliers.csv,也就是说会导入header部分的一条错误数据。

根据官方的说明文档,这个csv文件,要求:

  • utf-8编码的。
  • 使用英文逗号做分隔符(可更改)。
  • 表头可以有也可以没有(语句中可指定)。
  • 文件可以放在本地,也可以放在远程服务器。
  • ...

导入代码load csv

先初始化一下数据库(非必要操作,仅仅是为了数据展示方便):

MATCH (n) DETACH DELETE n

不做任何加工处理,直接导入category.csv文件,并建立相关Category标签的节点。其中id是自动生成的,csv文件中的每个列就会作为节点属性出现。

LOAD CSV WITH HEADERS FROM "http://data.neo4j.com/northwind/categories.csv" AS row
CREATE (n:Category) SET n = row

苏南大叔:neo4j图数据库,如何使用cypher语句直接导入csv文件? - category标签的节点
neo4j图数据库,如何使用cypher语句直接导入csv文件?(图7-3)

作为范例演示,products.csv下载到本地neo4jimport目录下,使用file协议导入,并且对字段进行了部分简单的字符串加工。

LOAD CSV WITH HEADERS FROM "file:///products.csv" AS row
CREATE (n:Product)
SET n = row,
n.productName = trim(toLower(reverse(row.productName))),
n.quantityPerUnit = rtrim(replace(toUpper(row.quantityPerUnit),"-","每")),
n.unitPrice = toFloat(row.unitPrice),
n.unitsInStock = toInteger(row.unitsInStock), 
n.discontinued = (row.discontinued <> "0"),
n.test = 'test '+ row.supplierID

苏南大叔:neo4j图数据库,如何使用cypher语句直接导入csv文件? - 导入product标签节点并进行加工
neo4j图数据库,如何使用cypher语句直接导入csv文件?(图7-4)

苏南大叔:neo4j图数据库,如何使用cypher语句直接导入csv文件? - 产品属性展示
neo4j图数据库,如何使用cypher语句直接导入csv文件?(图7-5)

不设置WITH HEADERS语句导入suppliers.csv文件,因为没有指明WITH HEADERS,所以表头内容也作为一条数据被插入到了图数据库中,所以存在一条错误数据。当然,如果csv文件本身是没有表头项目的话,这里就不会有这条错误数据存在了。

LOAD CSV FROM 'file:///suppliers.csv' AS line
CREATE (:Suppliers {name: line[1], tmp: toInteger(line[2])})

苏南大叔:neo4j图数据库,如何使用cypher语句直接导入csv文件? - 被错误导入的表头数据
neo4j图数据库,如何使用cypher语句直接导入csv文件?(图7-6)

LOAD CSV WITH HEADERS FROM '' as rowLOAD CSV FROM '' as line
CREATE (n:Product) SET n = rowCREATE (:Suppliers {.......})
n.test = 'test '+ row.supplierIDtmp: toInteger(line[2])

创建关系展示效果

使用cql语句创建产品和分类之间的关系BelongTo

MATCH (p:Product),(c:Category)
WHERE p.categoryID = c.categoryID
CREATE (p)-[:BelongTo]->(c)

查看关系创建效果:

call db.schema.visualization

苏南大叔:neo4j图数据库,如何使用cypher语句直接导入csv文件? - 建立关系数据
neo4j图数据库,如何使用cypher语句直接导入csv文件?(图7-7)

neo4j-admin

回顾一下已经写过的一个导入csv的方式,详情请参考:

在这个方式中,使用了一组csv文件,一个用于定义节点,另外一个用于定义关系。两个csv文件之间有数据关联关系。然后使用下面的命令,来导入数据:

neo4j-admin import --nodes "nodes.csv" --relationships "relationships.csv" --force

导入完毕需要重启生效。

neo4j-admin importload csv
节点数据csv文件里节点数据在csv文件里面
关系数据也定义在csv里关系可以根据需要自行创建
覆盖原有数据原有数据可以保留
推荐关闭服务再导入在线可运行
导入成功需要重启不用重启,直接可以看到结果

对比之下,load csv要比neo4j-admin import要效果好,使用上更加方便。

相关文章

综述

csv其实仅仅是一个信息交换的载体,在官方文档中,还有很多相关的例子和参数,这里就不一一说明了。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   neo4j    csv