性能提升

通用原则

  • 由于 Spark 擅长并行计算,所有非图形密集型的计算应在 Spark 层完成,而不是在 Neo4j 上的 Cypher® 中进行。

    • 尽可能在加载到 Neo4j 之前进行数据质量修复;这包括删除缺失记录、修改属性的数据类型等。

    • 尝试不同的 数据建模 策略。

    • 了解 Spark 优化 的应用方式。

  • 根据您的应用调整 Spark 和 Neo4j 参数。

    • 在使用高强度并行或大批量大小之前,请适当配置 Neo4j 实例的规模。

    • 尝试更大的批量大小(确保批次保持在 Neo4j 配置的堆内存范围内)。一般来说,批量越大,向 Neo4j 的整体吞吐量越快。

使用正确的索引和约束

在 Neo4j Cypher 层,常见的做法是使用 Spark 连接器生成 MERGE 查询。在 Neo4j 中,这会根据某个“键”查找节点,若节点不存在则创建它。

强烈建议在您用作 node.keysrelationship.source.node.keysrelationship.target.node.keys 或其他类似键选项的任何图属性上建立索引或约束。

导致性能差的常见原因是编写生成 MERGE Cypher 的 Spark 代码,或在没有相应数据库索引的情况下尝试在 Neo4j 中查找数据。这种情况下,Neo4j 服务器会遍历远超必要的数据量来满足查询,从而导致性能下降。