Neo4j cypher查询需要无限时间才能执行

时间:2018-01-15 17:38:50

标签: performance neo4j cypher

我已经加载了由1718关系连接的neo4j 3.3.1社区147节点的本地docker实例。这形成了一个高度循环的图形。

所有节点都有相同的标签:EClass和两个属性,类和包。

以下查询通过执行无数步骤来计算可从包modelQueryLanguage访问的类的数量。

MATCH (a:EClass {package: 'modelQueryLanguage'})-[*1..]->(b)
RETURN count(DISTINCT b)

问题是,这个查询永远不会完成。

我的直觉告诉我,distinct子句应该为图的潜在无限遍历定义一个停止条件。

如何编写等效的cypher查询但执行速度快?

1 个答案:

答案 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
相关问题