NEO4J 数据导入,处理,关系,坑

最近有人问过我,每天一篇到底是在做什么,对知识这样共享表示不理解,其实我并不知道怎么回答这个问题,只能回答天性使然,惯性使然,三个字习惯了。

NEO4J 的学习也是由于业务的驱使,并非毫无目的的学习,NEO4J的确是可以解决目前其他数据库无法快速或简便解决的问题。

前两期都是在初级的使用上,本期开始要在数据的导入,以及数据关系的建立,以及索引的建立。

NEO4J 本身有两种导入数据的方法

1  LOAD CSV 的方式

2  Bulk importer for Large Datasets

这两种方式之间的不同是导入数据的速度和方式以及对数据库本身的影响

从灵活性和数据的可修复性来讲,LOAD CSV方式是比较被推荐的,而BULK import for large dataset 则是你的数据流太大,并且是初始化的时候可以进行数据的导入。

首先要使用load csv方式导入数据,注意两层 (以下的操作和配置均是在社区版,社区和企业版有很多的不同功能受限严重)

1  系统的配置

需要打开  dbms.security.allow_csv_import_from_file_urls=trun

同时需要设置相关的import

社区版的基本上调节这两个参数就可以了

2  导入的方式与限流

下面是一个导入数据的语句,数据用逗号分隔,这里里面需要注意的是如果你的数据本身就有逗号,这就比较麻烦了,可能需要使用转移符,但一般如果是做NEO4J 的基础数据,实在让我想不到有什么属性里面要带有逗号。

其中上面的文字是官方文档对于CSV 的导入数据的提示,数据在导入前,需要进行数据清理。

下面就来说说导入数据中存在的几个问题

1  怪异的字符,尤其数据中带有 - -> <- 等数据  其中这些是关系符号等,所以如果后期在查询中带有这些符合就需要通过转移符,或者·· 来规避查询的失败,所以早期数据的重新整理是重要的。

2  导入数据时,对NULL 数据要有处理,这里不希望在带有NULL 数据,虽然NOE4J 可以允许属性中带有NULL。

3  导入大量数据时需要分批的进行commit 具体行数要看你的内存,否则会溢出内存

4  导入数据的字符格式需要UTF-8 

5  dbms.import.csv.legacy_quote_escaping  中如果设置为true 则 \ 作为转移符。

6 字符可以添加“” 双引号,但在读取数据时会将其去掉

也可以在导入前先在BROSWER 中看看数据的大概

LOAD CSV FROM "file:/app1.csv" AS line WITH line RETURN line LIMIT 5

下面的方式是导入没有页头的数据,也就是上来第一行就是数据,上面的是10000条提交一次,下面是加载数据文件的名字,最下面的 create 开始就是创建节点

:auto using periodic commit 10000

LOAD CSV FROM "file:/app1.csv" AS line

create (:APPLICATION_ID{APPLICATIONNO:line[0],NAME:line[1],PROVINCES:line[2],CITY:line[3],BUY_PROVINCES:line[4],BUY_CITY:line[5],REGISTRATION_PROVINCES:line[6],REGISTRATION_CITY:line[7],INVOICECOMPANY:line[8],BRAND:line[9],SUBMITDATE:line[10],CAR_TYPE:line[11]})

当然如果有页头的话方式就会不同

CREATE INDEX ON:APPLICATION_ID (APPLICATIONNO);

可以根据节点+属性来对需要查询的数据进行索引的添加

下面就以一个实例

这边导入两个node 的数据,一个是订单,一个购买人,然后通过关系来反映之间的关系(初级水平)实际上关系可以很复杂,节点可以很多。

节点1  100万数据 ORDER 订单   节点名  APPLICATION_ID

节点2  10万数据  customer 信息  节点名

通过 CSV方式导入数据,没10000条commit一次

:auto using periodic commit 10000

LOAD CSV WITH HEADERS FROM "file:/app1.csv" AS line

create (:APPLICATION_ID {APPLICATIONNO:line.APPLICATIONNO,NAME:line.NAME,PROVINCES:line.PROVINCES,CITY:line.CITY,BUY_PROVINCES:line.BUY_PROVINCES,BUY_CITY:line.BUY_CITY,REGISTRATION_PROVINCES:line.REGISTRATION_PROVINCES,REGISTRATION_CITY:line.REGISTRATION_CITY,INVOICECOMPANY:line.INVOICECOMPANY,BRAND:line.BRAND,SUBMITDATE:line.SUBMITDATE,CAR_TYPE:line.CAR_TYPE})

:auto using periodic commit 10000

LOAD CSV WITH HEADERS FROM "file:/peop10.csv" AS line

create (:BROWWER_ID {APPLICATIONNO:line.APPLICATIONNO,CNAME:line.CNAME,IDCARD:line.IDCARD,PHONE:line.PHONE})

其中可以通过上的信息看到两个节点中的APPLICATIONNO 是建立关系的关键点。

MATCH p=(a:APPLICATION_ID)-[]-(b:BROWWER_ID)

where a.APPLICATIONNO='GW-A264061000'

return b.IDCARD,a.APPLICATIONNO

通过下面的语句将两个节点之间的关系进行建立,关系 r_peope_order

MATCH (a:APPLICATION_ID),(b:BROWWER_ID) where a.APPLICATIONNO = b.APPLICATIONNO create (a) - [r:r_people_order] -> (b)

通过查询语句就可以开始查询某个订单和人之间的关系,当然上面的关系台单纯,所以给出的图也就比较简单,实际上通过复杂关系的建立,以及业务逻辑的复杂,相关的图的复杂度就会越来越高。

最后总结,NEO4J 的数据导入的方法不止上面的,还有通过neo4j-admin import更快速的导入的方法,找时间可以继续,另外在逻辑关系方面还需要继续深入,至于坑,主要在数据导入初期,对于节点,属性,关系等问题的清晰度,以及导入数据的中的系统配置例如大部分网上的东西都是基于WINDOWS 所以由于某些误导,导致初期的数据导入不成功,并且由于数据的格式的问题,也导致多次导入数据的失败问题。所以不经历xx,看见彩虹是很难的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章