Neo4J插入需要时间

时间:2018-07-04 17:24:04

标签: neo4j cypher neo4j-apoc

我有一个查询,要花很长时间才能插入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;

1 个答案:

答案 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节点是否存在,而无需检查其他任何节点属性。