neo4j图数据库,如何使用cypher语句直接导入csv文件?
发布于 作者:苏南大叔 来源:程序如此灵动~neo4j
图数据库,是如何导入既有的csv
文件的呢?其实根据csv
文件的基本情况,也有不同的方案可选。可以通过neo4j-admin
导入数据库,也可以使用cypher
的load csv
功能导入数据库。两者适用的情况有所不同,大家按需取用。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文主要讲述neo4j
的load csv
功能,通过load
识别csv
中的数据,然后简要加工导入。本文测试环境:win10
,neo4j社区版@4.4.6
,java@11.0.14
。
csv文件数据
进入本文的正题,neo4j
是如何使用load csv
导入csv
数据的呢?本文的龙套演员是neo4j
自带的northwind
数据。这一系列数据共有五个文件,这里选取products.csv
、categories.csv
、suppliers.csv
文件作为例子。文件地址:
- http://data.neo4j.com/northwind/products.csv
- http://data.neo4j.com/northwind/categories.csv
- http://data.neo4j.com/northwind/suppliers.csv
数据结构如下图所示:
本文将完整导入products.csv
和categories.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
作为范例演示,products.csv
下载到本地neo4j
的import
目录下,使用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
不设置WITH HEADERS
语句导入suppliers.csv
文件,因为没有指明WITH HEADERS
,所以表头内容也作为一条数据被插入到了图数据库中,所以存在一条错误数据。当然,如果csv
文件本身是没有表头项目的话,这里就不会有这条错误数据存在了。
LOAD CSV FROM 'file:///suppliers.csv' AS line
CREATE (:Suppliers {name: line[1], tmp: toInteger(line[2])})
LOAD CSV WITH HEADERS FROM '' as row | LOAD CSV FROM '' as line |
---|---|
CREATE (n:Product) SET n = row | CREATE (:Suppliers {.......}) |
n.test = 'test '+ row.supplierID | tmp: toInteger(line[2]) |
创建关系展示效果
使用cql
语句创建产品和分类之间的关系BelongTo
:
MATCH (p:Product),(c:Category)
WHERE p.categoryID = c.categoryID
CREATE (p)-[:BelongTo]->(c)
查看关系创建效果:
call db.schema.visualization
neo4j-admin
回顾一下已经写过的一个导入csv
的方式,详情请参考:
在这个方式中,使用了一组csv
文件,一个用于定义节点,另外一个用于定义关系。两个csv
文件之间有数据关联关系。然后使用下面的命令,来导入数据:
neo4j-admin import --nodes "nodes.csv" --relationships "relationships.csv" --force
导入完毕需要重启生效。
neo4j-admin import | load csv |
---|---|
节点数据csv文件里 | 节点数据在csv文件里面 |
关系数据也定义在csv里 | 关系可以根据需要自行创建 |
覆盖原有数据 | 原有数据可以保留 |
推荐关闭服务再导入 | 在线可运行 |
导入成功需要重启 | 不用重启,直接可以看到结果 |
对比之下,load csv
要比neo4j-admin import
要效果好,使用上更加方便。
相关文章
- https://neo4j.com/docs/cypher-manual/4.4/clauses/load-csv/#query-load-csv
- https://newsn.net/say/neo4j-load-csv.html
- https://newsn.net/say/neo4j-import-csv.html
- https://newsn.net/say/neo4j-export-csv.html
综述
csv
其实仅仅是一个信息交换的载体,在官方文档中,还有很多相关的例子和参数,这里就不一一说明了。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。