笛卡尔积(Cross Product)类型的 Cypher 查询性能不佳
就像 SQL 一样,如果未正确连接查询的各个部分,就会产生交叉(笛卡尔)乘积,而这很少是你想要的。下面是一个例子
MATCH (p:Person), (m:Movie)
RETURN p, m;
在 Cypher 中,p 包含图中所有带有 :Person 标签的节点,而 m 包含图中所有带有 :Movie 标签的节点。返回这两个变量会把每个 p 节点与每个 m 节点组合在一起,结果如下
如果有三个带有 Person 标签的节点
-
Neo,
-
Trinity, and
-
Morpheus
以及三个带有 Movie 标签的节点
-
The Matrix,
-
The Matrix Reloaded, and
-
The Matrix Revolutions
上述 Cypher 的结果将是
| p | m |
|---|---|
Neo |
The Matrix |
Neo |
The Matrix Reloaded |
Neo |
The Matrix Revolutions |
Trinity |
The Matrix |
Trinity |
The Matrix Reloaded |
Trinity |
The Matrix Revolutions |
Morpheus |
The Matrix |
Morpheus |
The Matrix Reloaded |
Morpheus |
The Matrix Revolutions |
请记住,这只是一个简单的例子,所以结果集很小。在生产规模的图中,这将是一个非常大的查询,可能会消耗大量内存。
一般而言,意外的交叉乘积出现在更复杂的查询中。它们常见于包含许多 WITH 子句的查询,需要仔细检查查询才能发现问题。通过遵循通用的性能最佳实践,可以轻松避免这种情况。尽可能具体地编写查询,确保使用标识符正确关联查询的各个部分,只返回所需的数据。同时,对慢查询进行分析,以便了解时间和资源的消耗位置。
从 Neo4j 2.3 版本开始,在 Neo4j 浏览器或使用 EXPLAIN 运行查询时会发出警告,提示此问题。 |
此页面有帮助吗?