neo4j - 为什么这个密码查询永远不会完成
解决方案
原因是您正在执行没有上限的可变长度关系。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
请注意,扩展和计算可能路径的数量并不太费劲,我们可以在几秒钟内得到。但是进行可能成倍增加路径数量的属性访问或额外计算可能是一个问题,并且将这么多行数据流回,尤其是浏览器应用程序,可能是一个问题。
更重要的是,我不认为你真的想要处理超过一百万个结果。查询实际执行的操作可能与您真正想要的完全不同。因此,您可能想澄清您希望查询做什么,因为当前的方法不可行。
推荐阅读
- kotlin - Kotlin 可变集合是线程安全的吗?
- postgresql - 如何强制 postgres 函数不在事务中
- python - 使用 schedule 在 Python 中调度作业
- javascript - 为什么我可以通过 axios 连接 API?
- android - 如何将 Google Pay 集成到 Flutter 应用中?
- php - Symfony3.4:无法从参数的请求信息中猜测如何获取Doctrine实例
- flutter - 如何通过点击屏幕并通过 Flutter 中的按钮强制关闭来避免关闭 alertDialog
- python - 更改字典中项目的数据类型
- vue.js - 在一个文件组件中添加多个标签“模板”
- android - 获取文档 Cloud Firestore 的字段(AndroidStudio-Kotlin)