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

Posted

技术标签:

【中文标题】在庞大的数据集上优化 Neo4j 密码查询【英文标题】:Optimize Neo4j cypher query on huge dataset 【发布时间】:2022-01-18 18:27:52 【问题描述】:

以下查询无法在具有约 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)

【问题讨论】:

【参考方案1】:

一些建议:

为您的关系添加方向将减少 MATCH 中的路径数量 确保您对合并的所有属性都有索引 在第二个 MERGE 中,还要添加方向。

【讨论】:

【参考方案2】:

我终于通过使用以下查询(并通过索引 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 运行了我的初始问题查询但没有成功。

【讨论】:

以上是关于在庞大的数据集上优化 Neo4j 密码查询的主要内容,如果未能解决你的问题,请参考以下文章

在庞大的数据集上使用 IN 是个好主意吗?

Neo4j - 复杂的密码查询 - 需要外连接

Neo4j - 图形数据科学库 - 如何对图形目录中的命名图形进行密码查询?

Neo4j 密码查询以获取与特定其他节点没有关系的所有节点

在 neo4j 密码查询中使用多个匹配子句不会返回任何结果

Neo4j 图中的密码查询