"查询LIMIT 1"需要永远,而#34; ... WITH x LIMIT 1查询"瞬间

时间:2017-09-01 16:28:57

标签: neo4j cypher

版本信息:

{
  "edition" : "enterprise",
  "version" : "3.2.2"
}

我有一个Neo4j数据库,有数百万个标签U和标签D的实例。每个U通过关系WITH_D连接到一个D.几个我们可能会共享相同的D.我的目标是获得一个D和所有我们连接的列表。

为什么第一个查询会无限期地挂起......

match (d:D)<-[:WITH_D]-(u:U)
return d, collect(u) limit 1

然而这个会在几毫秒内立即返回?

match (d:D) with d limit 1
match (d)<-[:WITH_D]-(u:U)
return d, collect(u)

第一个查询计划涉及逐个标签扫描,产生数百万个节点,然后&#34;展开全部&#34;产生数百万个节点,而第二个是逐个标签的扫描,过滤到一个节点,然后&#34;全部展开&#34;。

似乎处理限制的方式存在问题,即在某些情况下,它根本就不够懒惰。 这会导致许多难以处理的子查询,以避免非终止查询。由于数据库接近10亿个节点,我多次遇到过这个问题。有线索吗?

由于

1 个答案:

答案 0 :(得分:1)

我认为这里的要点是您在查询中使用LIMIT 1的位置。

在第一个查询中,您首先在MATCH:D标签之间:U 所有可能的模式。在查询结束时,您将结果限制为1.即:您匹配所有模式并使用LIMIT“作为过滤器”覆盖整个结果。

在第二个查询中,您MATCH :D个节点限制为一个。之后,您将使所有:U连接到此单个节点。也就是说:第一个MATCH在第一次出现:D节点时正在完成。因此LIMIT正在读取时间使用,而不仅仅是在返回整个结果之前。