我有以下查询运行在neo4j(社区3.5)
MATCH (a:master_node:PERF:Application)-[r1]->(n:master_node:PERF)-[r:AFFINITY]->(m:master_node:PERF)<-[r2]-(a1:master_node:PERF:Application)
WHERE exists(n.latest_ingestion)
AND exists(m.latest_ingestion)
AND id(a) <> id(a1)
MERGE (a)<-[:APP_AFFINITY]-(a1)
和我的neo4j配置如下:
heap_size : 8GB
page_cache : 4GB
和我对属性(名称)和以上查询运行超过100k节点的标签(应用程序)的索引。但是查询运行的时间长了,占用了太多的内存。
请帮助我提高性能。
您没有在此查询中使用name
属性,因此您的索引没有帮助。唯一可能有帮助的索引是在:master_node(latest_ingestion)
或:PERF(latest_ingestion)
上,这可能会根据db统计数据将查询从使用标签扫描更改为索引扫描。
另外,您可能想要考虑批处理这些更新,可能使用来自APOC过程的apoc.periodic.iterate()
。比如:
CALL apoc.periodic.iterate("
MATCH (a:master_node:PERF:Application)-->(n:master_node:PERF)-[:AFFINITY]->(m:master_node:PERF)<--(a1:master_node:PERF:Application)
WHERE exists(n.latest_ingestion)
AND exists(m.latest_ingestion)
AND id(a) <> id(a1)
RETURN a, a1",
"MERGE (a)<-[:APP_AFFINITY]-(a1)",
{}) YIELD batches, total, errorMessages
RETURN batches, total, errorMessages