我有一个查询,要花很长时间才能插入neo4j,查询看起来像这样:
create index on :symaccess_symdev(dir_port);
create index on :symaccess_symdev(host_lun);
create index on :symaccess_symdev(ini_tiator_group_name);
create index on :symaccess_symdev(sym_dev);
CALL apoc.load.json('file:////root/output/1530115956414/dev.json') YIELD
value AS row UNWIND row.symdev AS symdevs
MERGE (accesssymdev:symaccess_symdev {
sym_dev: symdevs.sym_dev,
host_lun: symdevs.host_lun,
ini_tiator_group_name: symdevs.ini_tiator_group_name,
dir_port: symdevs.dir_port
})
ON CREATE SET
accesssymdev.attr_percentage = symdevs.attr_percentage,
accesssymdev.cap_mb = toFloat(symdevs.cap_mb),
accesssymdev.physicaldevicename = symdevs.physicaldevicename;
答案 0 :(得分:1)
假设sym_dev
属性值对于每个symaccess_symdev
节点都是唯一的,那么此查询可能会更快:
CALL apoc.load.json('file:////root/output/1530115956414/dev.json') YIELD
value AS row UNWIND row.symdev AS symdevs
MERGE (a:symaccess_symdev {sym_dev: symdevs.sym_dev})
ON CREATE SET
a.host_lun = symdevs.host_lun,
a.ini_tiator_group_name = symdevs.ini_tiator_group_name,
a.dir_port = symdevs.dir_port,
a.attr_percentage = symdevs.attr_percentage,
a.cap_mb = toFloat(symdevs.cap_mb),
a.physicaldevicename = symdevs.physicaldevicename;
MERGE
最多只能使用一个索引,因此您当前的查询将使Cypher计划程序选择一个索引(在适用的4个索引中)。使用该索引生成一组候选节点后,仍然需要检查每个候选节点的其他3个属性。如果它选择的索引不是非常有选择性(因为往往有许多具有相同属性值的节点),则每个MERGE
需要完成很多工作。
假设sym_dev
属性值是唯一的,上面的查询简化了MERGE
,因此它将快速发现所需的symaccess_symdev
节点是否存在,而无需检查其他任何节点属性。