在庞大的数据集上优化Neo4j密码查询



以下查询无法在具有约2M个节点的数据集上运行。我该怎么做才能让它跑得更快?

MATCH (cc:ConComp)-[r1:IN_CONCOMP]-(p1:Person)-[r2:SAME_CLUSTER]-(p2:Person)
WHERE cc.cluster_type = "household"
MERGE (cluster:Cluster {CLUSTER_TMP_ID:cc.CONCOMP_ID + '|' + r2.root_id, cluster_type:cc.cluster_type })
MERGE (cluster)-[r3:IN_CLUSTER]-(p1)

许多建议:

  • 为关系添加方向将减少MATCH中的路径数
  • 确保对合并的所有属性都有索引
  • 在第二次MERGE中,也添加方向

我最终通过使用以下查询(并通过索引cc.cluster_type和cc.CONCOMP_ID(找到了解决方案:

CALL apoc.periodic.iterate('MATCH (cc:ConComp)<-[r1:IN_CONCOMP]-(p1:Person)-[r2:SAME_CLUSTER]-(p2:Person) WHERE cc.cluster_type = "household" WITH DISTINCT cc.CONCOMP_ID + "|" + r2.root_id as id_name, cc.cluster_type as cluster_type_name, p1 RETURN id_name, cluster_type_name, p1', '
MERGE (cluster:Cluster {CLUSTER_TMP_ID: id_name, cluster_type: cluster_type_name}) 

MERGE (cluster)-[r3:IN_CLUSTER]->(p1)', {batchSize:10000, parallel:false})

我准确地说,我之前用apoc.periodic.iterate运行过我的初始问题查询,但没有成功。

最新更新