一 爲什麼用load csv,
之前寫過用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!
三,總結
任何問題都能在網上找到答案!!!