之前写过用neo4j-import 的一个博客,本以为我的neo4j奇幻之旅就要结束了,然鹅,领导说咱们每天还有100w的数据需要跑进去。
neo4j-import肯定不能再用了,因为每次都要清空数据库,第一次投产生成的csv文件有10多个G,把这些数据文件传输到neo4j的服务器上很占资源,如果每天重跑一次,显然不太现实。
batch-neo4j我也研究了一下,只需要下载一个jar包,执行就可以了,不过好像这种只适合新增的数据,而我们的100w数据中还有修改的,即 如果节点已存在则修改,不存在则新增。
load csv 上边最快的两种方式都不能满足我的要求,我也很无奈,只得退而求其次,选择了不是很快的load csv,不过他的好处就是不用关闭neo4j的服务也可导入,导入方式也简单
使用load csv非常简单,直接将之前生成csv文件的脚本拿来就可以,在查询语句加上 where updateDate=sysdate
生成了三个csv文件pernode.csv comnode.csv rel.csv放到neo4j/import目录下,因为conf配置load csv默认目录是这里。
然后就是写导入命令
LOAD CSV FROM 'file:///pernode.csv' as line
merge(per:PERSONAL{cstId:line[0]})
on create set per.name=line[1],per.city=line[2]
on match set per.name =line[1],per.city=line[2]
LOAD CSV FROM 'file:///company.csv' as line
merge(com:COMPANY{cstId:line[0]})
on create set com.name=line[1],per.city=line[2]
on match set com.name =line[1],per.city=line[2]
这两个节点的导入还算顺利,but,关系的导入却出现了问题,就在第三行r:line[2]这个地方报错了,提示不能用‘[’这种特殊符号,研究了好久还是没有办法解决,我有大概十几种关系,总不可能自己写死吧。
LOAD CSV FROM 'file:///rel.csv' as line
match(f{cstId:line[0]}),match(t{cstId:line[1]})
merge(f) -[r:line[2]{property:line[3]}]-(t)
on create set r.property = line[3]
on match set r.property = line[3]
于是,我绞尽脑汁,千方百计,殚精竭虑,日思夜想,衣带渐宽 , 还是没想到解决的办法,就在我要放弃的时候,我寻思就将就着用java查询,然后用merge一条一条的修改吧,突然无意间找到了一篇博客,,,,,,,,
真是救了我的狗命。
https://jpanj.com/2018/neo4j-import-dynamic-relationship-type/
于是我把关系的导入语句改为
LOAD CSV FROM 'file:////rel.csv' AS line
MATCH (p1:{cstId:line[0]})
MATCH (p2:{cstId:line[0]})
WITH p1, p2, line
CALL apoc.merge.relationship(p1, line[2], {name: line[3]}, {}, p2) YIELD rel
RETURN rel
COOL!
任何问题都能在网上找到答案!!!