在load_csv中使用foreach近她,這種操作可以通過字段進行不同操作,更方便
LOAD CSV FROM {url} AS row
MATCH (o:Organization {name:row.org})
FOREACH (_ IN case when row.type = 'Person' then [1] else [] end|
MERGE (p:Person {name:row.name})
CREATE (p)-[:WORKS_FOR]->(o)
)
FOREACH (_ IN case when row.type = 'Agency' then [1] else [] end|
MERGE (a:Agency {name:row.name})
CREATE (a)-[:WORKS_FOR]->(o)
)
背景
在不停止服務(wù)的情況下膳帕,每隔一小時批量寫一次數(shù)據(jù)粘捎,我們選擇使用load_csv的方式,對于關(guān)系备闲,會有新增或者更新的過程晌端,對于節(jié)點,會判斷是是否存在恬砂,如果存在不進行任何操作咧纠,如果不存在,則新增節(jié)點泻骤。我們一小時的數(shù)據(jù)10W左右漆羔。
優(yōu)化過程
1.1
根據(jù)需求,首先我們需要使用merge狱掂,因為有match或者create的判斷演痒;其次我們使用using periodic commit 1000,保證1000條作為一次事務(wù)輸出
using periodic commit 1000
load csv from 'file:///attacker.csv' as line
merge (:Attacker{id:toInteger(line[0]),ip:line[1],country:line[2],province:line[3],city:line[4]});
通過這種方式導(dǎo)入的時候趋惨,發(fā)現(xiàn)10W條數(shù)據(jù)需要20分鐘左右才能導(dǎo)入成功鸟顺,因為這僅僅是一個節(jié)點,如果再導(dǎo)入其他節(jié)點和關(guān)系器虾,一小時根本不能完全導(dǎo)入讯嫂。
1.2
然后想到了如果我是用索引怎么樣,所以我對記錄的唯一標(biāo)識id進行索引兆沙,然后還是按照上面的方式導(dǎo)入欧芽,發(fā)現(xiàn)速度沒有提升。說明通過這種方式?jīng)]有使用到索引
create index on :Attacker(id)
1.3
因為上面的方式?jīng)]有使用到索引葛圃,那我們換一種思路千扔,merge的時候通過id進行匹配,然后其他屬性通過set的方式進行賦值
語句如下:
using periodic commit 1000
load csv from 'file:///attacker.csv' as line
merge (attack:Attacker2{id:toInteger(line[0])})
on create set attack.ip=line[1],attack.country=line[2],attack.province=line[3],attack.city=line[4];
通過這種方式库正,發(fā)現(xiàn)寫入10W條數(shù)據(jù)曲楚,5秒之內(nèi)寫入成功。