知识库

交叉积 Cypher 查询性能不佳

就像 SQL 一样,如果您没有正确连接查询的各个部分,它将导致交叉(笛卡尔)积,这很少是您想要的。以下是一个示例

MATCH (p:Person), (m:Movie)
RETURN p, m;

在 Cypher 中,发生的情况是 p 包含图中所有具有 :Person 标签的节点,而 m 包含图中所有具有 :Movie 标签的节点。返回这两个结果,每个节点 p 都与每个节点 m 相结合,如下所示

如果有三个标签为 Person 的节点

  • Neo,

  • Trinity,和

  • Morpheus

以及三个标签为 Movie 的节点

  • 黑客帝国,

  • 黑客帝国2:重装上阵,和

  • 黑客帝国3:矩阵革命

上述 Cypher 的结果将是

p m

Neo

黑客帝国

Neo

黑客帝国2:重装上阵

Neo

黑客帝国3:矩阵革命

Trinity

黑客帝国

Trinity

黑客帝国2:重装上阵

Trinity

黑客帝国3:矩阵革命

Morpheus

黑客帝国

Morpheus

黑客帝国2:重装上阵

Morpheus

黑客帝国3:矩阵革命

请记住,这是一个简单的示例,因此结果集很小。对于生产规模的图,这将是一个非常大,可能是内存密集型查询。

一般来说,无意中产生的交叉积会在更复杂的查询中发生。它们在包含多个 WITH 子句的查询中很常见,需要仔细查看查询以找出问题。通过遵循一般性能最佳实践,这可以轻松避免。尽可能具体地编写查询,确保使用标识符正确地将查询的各个部分联系起来,并且只返回您需要的数据。并分析您的慢速查询,以便您可以查看时间和工作量消耗在哪里。

从 Neo4j 2.3 开始,在 Neo4j 浏览器中或使用 EXPLAIN 运行查询时,会发出警告,以突出显示此问题。