为什么此密码查询从未完成

时间:2019-06-09 23:05:21

标签: neo4j cypher

这是查询:

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

这是完整的图: The entire graph

这是查询,当我尝试执行查询时会发生什么: Browser locks up

1 个答案:

答案 0 :(得分:1)

原因是您正在执行可变长度关系而没有上限。如果路径以:Table节点开始并以:Attribute节点结束,Cypher将尝试查找存在的所有可能的路径,无论该路径有多长。虽然每个路径仅遍历一次关系,但是使用其他关系返回到先前遍历的节点,然后使用另一个尚未遍历的关系在路径中保留并继续下去,没有任何限制。遍历。

即使在一个小的图形上,可能的路径数量也会爆炸。您可以亲自了解路径数量如何增长,以及随着探索的可能路径数量爆炸,数据库将如何变慢。

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

请注意,扩展并计算可能的路径数量并不是太费力,我们可以在几秒钟内完成。但是,进行属性访问或可能会成倍增加路径数量的其他计算可能是个问题,而将这么多的数据流(尤其是浏览器应用程序)流回去可能是个问题。

更重要的是,我认为您真的不想处理超过一百万个结果。查询的实际操作可能与您真正想要的完全不同。因此,由于当前的方法不可行,您可能需要澄清查询的确切目的。