为什么没有笛卡尔乘积操作的neo4j查询计划速度较慢?

为什么没有笛卡尔乘积操作的neo4j查询计划速度较慢?,neo4j,cypher,profiling,graph-databases,cartesian-product,Neo4j,Cypher,Profiling,Graph Databases,Cartesian Product,我试图在Neo4j Cypher中分析一个查询 我从这个查询开始: PROFILE MATCH (t1:Trip{Direction:1, Route:"01"}),(t2:Trip{Direction:0, Route:"01"}) WITH t1, t2 LIMIT 1 MATCH p4 = (t2)−[:STARTS|STOPS|ENDS]−>(:BusStop), p3=(t1)−[:STARTS|STOPS|ENDS]−(:BusStop) RETURN p3, p4; 我得到

我试图在Neo4j Cypher中分析一个查询

我从这个查询开始:

PROFILE MATCH (t1:Trip{Direction:1, Route:"01"}),(t2:Trip{Direction:0, Route:"01"})
WITH t1, t2 LIMIT 1
MATCH p4 = (t2)−[:STARTS|STOPS|ENDS]−>(:BusStop), p3=(t1)−[:STARTS|STOPS|ENDS]−(:BusStop)
RETURN p3, p4;
我得到了以下执行计划:

总的db点击率为10。查询的分析速度相当快

在32分钟时,建议避免笛卡尔积运算。根据这一点,我将查询转换为以下内容:

PROFILE MATCH (t1:Trip{Direction:1, Route:"01"})
WITH t1 LIMIT 1
MATCH (t2:Trip{Direction:0, Route:"01"})
WITH t1, t2 LIMIT 1
RETURN t1, t2;
导致本执行计划:

总的db点击率为11:它增加了

现在,分析显示笛卡尔积消失了,但是执行速度似乎慢了很多,db命中率也增加了

为什么笛卡尔积消失了,速度却变慢了?
哪一个查询更好:没有笛卡尔积的查询,还是数据库命中率较低的查询?如何改进查询?

笛卡尔积并不总是坏的。如果您不打算创建笛卡尔乘积(如
匹配(p:Person),(m:Movie)
,这将为您提供所有人x所有电影的笛卡尔乘积),则它们可能是不好的

但是当你只匹配一对节点,或者像你的例子一样,查找两个节点,你只希望每个节点只有一个,这是一个完全正确的做法


所以,这一切都是关于意图,以及结果(这是笛卡尔积)是否令人惊讶。1 x 1=1的笛卡尔积,所以这没什么可怕的。

忽略估计行,这些对您没有多大帮助。对于规划者来说,这些数据就像是一个大概的数字,它涉及到非常广泛的数量级的估计。而是查看操作符之间的配置文件中的实际行。