我已经加载了由1718关系连接的neo4j 3.3.1社区147节点的本地docker实例。这形成了一个高度循环的图形。
所有节点都有相同的标签:EClass和两个属性,类和包。
以下查询通过执行无数步骤来计算可从包modelQueryLanguage访问的类的数量。
MATCH (a:EClass {package: 'modelQueryLanguage'})-[*1..]->(b)
RETURN count(DISTINCT b)
问题是,这个查询永远不会完成。
我的直觉告诉我,distinct子句应该为图的潜在无限遍历定义一个停止条件。
如何编写等效的cypher查询但执行速度快?
答案 0 :(得分:1)
Cypher的扩展模式将尝试找到与模式匹配的所有可能路径,唯一的限制是每条路径不能出现多次关系。对于高度连接的图形(以及对关系类型/方向的不充分限制),这成为一种不可行的扩展方式,因为图形中可能的唯一路径数量可能会变得巨大。这对于可达性查询来说并不理想。
APOC Procedures有一些path expander procedures专门用于这样的用例,其中每个节点只需要一个路径,而不是所有可能的路径。如果你只需要节点而不是路径,那么也需要一个程序。
以下是您的查询的使用示例:
MATCH (a:EClass {package: 'modelQueryLanguage'})
CALL apoc.path.subgraphNodes(a, {relationshipFilter:'>'}) YIELD node
RETURN count(node) as count