我在运行Windows Server 2012 r-2的24GB虚拟机中的2.4 GHz Xeon 4核(带8个线程)CPU上安装了Neo4J 3.0.6 CE。
它运行良好,通过REST调用申请贷款和登录应用程序的客户端详细信息,可以频繁更新(约每秒1-5次)。目前,总存储大小为18.48 GiB,有46741582个关系、68627444个属性和5360756个节点。
最近,我想删除一个CSV中包含的一系列关系,该CSV大约有1200万行,调用如下:
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'FILE:///ClientCallLogs.csv' AS line
WITH line
MATCH (c:Client {AtlasId: line.AtlasId})
-[ud:`used deviceid`]->
(devID:DeviceId {DID:line.DeviceId})
DELETE ud
在此调用之前,我在客户端和设备ID上定义了indeces,如下所示:
CREATE INDEX ON :Client(AtlasId)
和
CREATE INDEX ON :DeviceId(DID)
更改
USING PERIODIC COMMIT 1000 to USING PERIODIC COMMIT 100
没有明显的效果。
然而,这个调用开始得很好,但很快CPU就耗尽了,不久之后,Neo4J进程变得没有响应,并开始在进一步的REST调用中抛出异常。唯一的补救措施是终止并重新启动服务器,然后一切都恢复正常。
我应该更改什么?
您可以尝试使用定期提交。例如,每千行:
USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM 'FILE:///ClientCallLogs.csv' AS line
WITH line
MATCH (c:Client {AtlasId: line.AtlasId})
-[ud:`used deviceid`]->
(devID:DeviceId {DID:line.DeviceId})
DELETE ud
一定要使用索引:
create index on :Client(AtlasId);
create index on :DeviceId(DeviceId);