知识库

笛卡尔积(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 运行查询时会发出警告,提示此问题。
© . This site is unofficial and not affiliated with Neo4j, Inc.