首页 > 解决方案 > 为什么这个密码查询永远不会完成

问题描述

这是查询:

MATCH (t:Table)-[*]-(a:Attribute) RETURN t,a

这是完整的图表: 整个图

这是查询以及当我尝试执行它时会发生什么: 浏览器锁定

标签: neo4jcypher

解决方案


原因是您正在执行没有上限的可变长度关系。Cypher 将尝试找到所有可能存在的路径,无论路径有多长,只要路径以 :Table 节点开始并以 :Attribute 节点结束。虽然每个路径只会遍历一个关系,但没有限制使用不同的关系返回到先前遍历的节点,然后使用另一个 as-of-yet-untraversed-relationship-in-the-path 离开它并继续穿越。

即使在小图上,可能路径的数量也会爆炸式增长。您可以亲眼看到路径数量如何增长,以及随着探索的可能路径数量爆炸式增长,数据库将如何变慢。

MATCH (:Table)-[*..6]-(:Attribute) 
RETURN count(*) as pathsFound

现在如果快速完成,增加上限并运行它,并继续这样做,看看你能走多高,找到的路径有多高,在数据库开始遇到麻烦之前。

不过,我会为你节省一些时间。我重新创建了您的图表,当您的上限为 23 跳时,您达到了最大可能路径,并返回1371112图表中与该模式匹配的不同路径的总数。单独的浏览器将无法处理这么多行的数据。

您可以运行以下两个查询来验证它(假设这是您的整个图表):

MATCH (:Table)-[*..23]-(:Attribute) 
RETURN count(*) as totalPathsFound

MATCH path = (:Table)-[*..23]-(:Attribute) 
RETURN length(path) as pathLength, count(*) as pathsFound
ORDER BY pathLength DESC

请注意,扩展和计算可能路径的数量并不太费劲,我们可以在几秒钟内得到。但是进行可能成倍增加路径数量的属性访问或额外计算可能是一个问题,并且将这么多行数据流回,尤其是浏览器应用程序,可能是一个问题。

更重要的是,我不认为你真的想要处理超过一百万个结果。查询实际执行的操作可能与您真正想要的完全不同。因此,您可能想澄清您希望查询做什么,因为当前的方法不可行。


推荐阅读