交叉积 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 运行查询时,会发出警告,以突出显示此问题。 |
此页面是否有帮助?