之前介紹了利用LOAD CSV語(yǔ)句導(dǎo)入導(dǎo)入Neo4J的方法车猬,但是這種方法對(duì)于百萬(wàn)級(jí)的數(shù)據(jù)是無(wú)能為力的穿肄。我親自實(shí)踐了在python中利用py2neo和LOAD CSV語(yǔ)句導(dǎo)入百萬(wàn)級(jí)數(shù)據(jù)到Neo4J中闺阱,效率奇慢無(wú)比焚辅,大約估計(jì)了一下運(yùn)行時(shí)間己儒,構(gòu)建全量的圖數(shù)據(jù)庫(kù)可能需要一個(gè)多月時(shí)間,這個(gè)時(shí)間是萬(wàn)萬(wàn)不能接受的朴艰。
聰明的我靈機(jī)一動(dòng)观蓄,就想到了利用python中的_thread實(shí)現(xiàn)多線程導(dǎo)入。發(fā)現(xiàn)多線程導(dǎo)入的方式也行不通祠墅,因?yàn)镹eo4J擁有鎖的機(jī)制,同一時(shí)間不能多次寫入歌径,即使是多線程毁嗦,也只有一個(gè)線程能正常運(yùn)行,其余的線程會(huì)報(bào)錯(cuò)回铛,無(wú)法成功導(dǎo)入狗准。
其實(shí)目前主要有以下幾種導(dǎo)入方式,如果進(jìn)行十萬(wàn)級(jí)別以上的數(shù)據(jù)導(dǎo)入時(shí)茵肃,就已經(jīng)要拋棄LOAD CSV方法了腔长,今天我來(lái)講一下Neo4j-import的導(dǎo)入實(shí)踐。
這邊重點(diǎn)來(lái)說(shuō)一下官方最快的neo4j-import验残,使用的前提條件:
- graph.db需要清空(首次導(dǎo)入)或者新建一個(gè)數(shù)據(jù)庫(kù)捞附;
- neo4j需要停掉;
- 導(dǎo)入文件格式為CSV您没;
neo4j-import參數(shù)說(shuō)明:
- –into:數(shù)據(jù)庫(kù)名稱
- –bad-tolerance:能容忍的錯(cuò)誤數(shù)據(jù)條數(shù)(即超過(guò)指定條數(shù)程序直接掛掉)鸟召,默認(rèn)1000
- –multiline-fields:是否允許多行插入(即有些換行的數(shù)據(jù)也可讀取)
- –nodes:插入節(jié)點(diǎn)
- –relationships:插入關(guān)系
屬性
- 數(shù)據(jù)類型 int, long, float, double, boolean, byte, short, char,string氨鹏,默認(rèn)為string
- 并列值的默認(rèn)分隔符為; --array-delimiter用這個(gè)聲明其他的分隔符
- 使用:IGNORE忽略字段的數(shù)據(jù)
網(wǎng)上的相關(guān)教程有很多欧募,方法各不相同(有的帶表頭有的不帶,有的還把表頭和數(shù)據(jù)分成兩個(gè)文件存儲(chǔ))仆抵,大坑也比較多跟继,我也是結(jié)合了多個(gè)教程加上自己的理解才成功導(dǎo)入了數(shù)據(jù)种冬。
我要一次性導(dǎo)入十個(gè)實(shí)體和十幾種關(guān)系。我采用表頭和數(shù)據(jù)在同一個(gè)文件中的形式舔糖,對(duì)于多個(gè)實(shí)體和多種關(guān)系碌廓,這種方式比較方便簡(jiǎn)介,文件看起來(lái)不會(huì)特別多特別亂剩盒。
首先對(duì)于實(shí)體csv文件谷婆,修改表頭:
- :ID 有一個(gè)字段定義id,必須存在辽聊,而且唯一(后面加上實(shí)體名)
- :LABEL 定義標(biāo)簽纪挎,用;分割多標(biāo)簽
:ID(機(jī)構(gòu)),:LABEL,companyname,companysname,companytypecode,companytypename,regaddress,officeaddress,orgform,founddate
10324824,機(jī)構(gòu),華夏銀行股份有限公司武漢硚口支行,華夏銀行武漢硚口支行,01,銀行,,,,
10324851,機(jī)構(gòu),國(guó)家開(kāi)發(fā)銀行股份有限公司貴州省分行,國(guó)家開(kāi)發(fā)銀行貴州省分行,01,銀行,,,,
10324871,機(jī)構(gòu),盛京銀行股份有限公司北京官園支行,盛京銀行北京官園支行,01,銀行,,,,
10324880,機(jī)構(gòu),天津津南村鎮(zhèn)銀行股份有限公司,天津津南村鎮(zhèn)銀行,01,銀行,津南區(qū)津沽大街景明花園三號(hào)樓底商2號(hào),,,2010-12-10
:ID(人物),:LABEL,personname,othername,englishname,sex,birthdate,highestdegreecode,highestdegree
20000001,人物,錢明光,,,0,1947,340002,本科
20000002,人物,譚文鋕,,,0,194802,,
20000003,人物,黃蓉芳,,,1,194410,,
之后對(duì)于關(guān)系文件,修改表頭:
- :START_ID 起點(diǎn)id (后面加上實(shí)體名)
- :END_ID 終點(diǎn)id (后面加上實(shí)體名)
- :TYPE 關(guān)系類型
:TYPE,:START_ID(機(jī)構(gòu)),:END_ID(人物),relationstarttime,relationendtime
最終控制方,10007173,,2013-03-22 12:00:00,2012-12-31 12:00:00
最終控制方,10004301,,2013-03-26 12:00:00,2012-12-31 12:00:00
最終控制方,10004137,,2013-04-19 12:00:00,2012-12-31 12:00:00
最終控制方,10109782,,2014-02-26 12:00:00,2013-12-31 12:00:00
csv數(shù)據(jù)文件處理完之后,開(kāi)始編寫導(dǎo)入命令跟匆,運(yùn)行neo4j****/bin目錄下的neo4j-import异袄。
- bad-tolerance建議設(shè)置的大一點(diǎn),如果存在關(guān)系中的START_ID 或者END_ID找不到實(shí)體的對(duì)應(yīng)ID就會(huì)被判定為錯(cuò)誤的數(shù)據(jù)玛臂,如果錯(cuò)誤數(shù)據(jù)數(shù)超過(guò)了bad-tolerance烤蜕,導(dǎo)入將直接停止,所以我在這里設(shè)置為了10000000迹冤。
- 雖然有默認(rèn)值讽营,保險(xiǎn)起見(jiàn)--id-type再指定一下為string
- 一個(gè)--nodes后面跟一個(gè)實(shí)體的csv文件
- 一個(gè)--relationships后面跟一個(gè)關(guān)系的csv文件
最終在Ubuntu18.04上導(dǎo)入命令為:
bin/neo4j-import --multiline-fields=true --bad-tolerance=10000000 --into /media/brx/2d79a6a5-f419-aa4c-b391-314a73033208/neo4j-community-3.3.6/data/databases/graph.db --id-type string --nodes 行業(yè).csv --nodes 業(yè)務(wù).csv --nodes 主營(yíng)產(chǎn)品.csv --nodes 事件.csv --nodes 人物.csv --nodes 機(jī)構(gòu).csv --nodes 金 融產(chǎn)品.csv --nodes 地區(qū).csv --relationships 主營(yíng)產(chǎn)品-主營(yíng)產(chǎn)品.csv --relationships 事件-業(yè)務(wù).csv --relationships 事件-機(jī)構(gòu).csv --relationships 人物-人物.csv --relationships 機(jī)構(gòu)-主營(yíng)產(chǎn)品.csv --relationships 機(jī)構(gòu)-人物.csv --relationships 機(jī)構(gòu)-地區(qū).csv --relationships 機(jī)構(gòu)-機(jī)構(gòu).csv --relationships 機(jī)構(gòu)-行業(yè).csv --relationships 金融產(chǎn)品-機(jī)構(gòu).csv
如果服務(wù)器環(huán)境為CentOS,需要把所有的相對(duì)路徑改為絕對(duì)路徑泡徙,導(dǎo)入命令為:
bin/neo4j-import --multiline-fields=true --bad-tolerance=10000000 --into /data/program/neo4j-community-3.5.3/data/databases/yuqing.db --id-type string --nodes /data/program/neo4j-community-3.5.3/行業(yè).csv --nodes /data/program/neo4j-community-3.5.3/業(yè)務(wù).csv --nodes /data/program/neo4j-community-3.5.3/主營(yíng)產(chǎn)品.csv --nodes /data/program/neo4j-community-3.5.3/事件.csv --nodes /data/program/neo4j-community-3.5.3/人物.csv --nodes /data/program/neo4j-community-3.5.3/機(jī)構(gòu).csv --nodes /data/program/neo4j-community-3.5.3/金融產(chǎn)品.csv --nodes /data/program/neo4j-community-3.5.3/地區(qū).csv --relationships /data/program/neo4j-community-3.5.3/主營(yíng)產(chǎn)品-主營(yíng)產(chǎn)品.csv --relationships /data/program/neo4j-community-3.5.3/事件-業(yè)務(wù).csv --relationships /data/program/neo4j-community-3.5.3/事件-機(jī)構(gòu).csv --relationships /data/program/neo4j-community-3.5.3/人物-人物.csv --relationships /data/program/neo4j-community-3.5.3/機(jī)構(gòu)-主營(yíng)產(chǎn)品.csv --relationships /data/program/neo4j-community-3.5.3/機(jī)構(gòu)-人物.csv --relationships /data/program/neo4j-community-3.5.3/機(jī)構(gòu)-地區(qū).csv --relationships /data/program/neo4j-community-3.5.3/機(jī)構(gòu)-機(jī)構(gòu).csv --relationships /data/program/neo4j-community-3.5.3/機(jī)構(gòu)-行業(yè).csv --relationships /data/program/neo4j-community-3.5.3/金融產(chǎn)品-機(jī)構(gòu).csv
如果沒(méi)有報(bào)錯(cuò)的話橱鹏,就是導(dǎo)入成功了,會(huì)提示你有多少個(gè)實(shí)體堪藐,多少個(gè)關(guān)系莉兰,導(dǎo)入失敗的數(shù)據(jù)也會(huì)存儲(chǔ)到一個(gè)文件大功告成,導(dǎo)入成功礁竞,bin/neo4j console應(yīng)該就可以看到數(shù)據(jù)已經(jīng)被成功導(dǎo)入啦