版本信息:
{
"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亿个节点,我多次遇到过这个问题。有线索吗?
由于
答案 0 :(得分:1)
我认为这里的要点是您在查询中使用LIMIT 1
的位置。
在第一个查询中,您首先在MATCH
和:D
标签之间:U
所有可能的模式。在查询结束时,您将结果限制为1.即:您匹配所有模式并使用LIMIT
“作为过滤器”覆盖整个结果。
在第二个查询中,您MATCH
:D
个节点限制为一个。之后,您将使所有:U
连接到此单个节点。也就是说:第一个MATCH
在第一次出现:D
节点时正在完成。因此LIMIT
正在读取时间使用,而不仅仅是在返回整个结果之前。