Poor performance of Neo4j Cypher query for transitive closure
我有一个具有?89K个节点和?1.2M个关系的图,并且正在尝试通过以下Cypher查询来获取单个节点的传递闭包:
1 2 3 4 | start n=NODE(<id of a single node of interest>) match (n)-[*1..]->(m) where has(m.name) return distinct m.name |
不幸的是,该查询消失了,并且似乎没有回来(尽管公平地说,在这一点上,我只给出了大约一个小时的执行时间)。
关于如何优化我在此处的内容或实现要求的更好方法的任何建议?
笔记:
- Neo4J v2.0.0(通过Homebrew安装)。
- Mac OSX 10.8.5
- Oracle Java 1.7.0_51
- 8GB物理RAM(分配给neo4j JVM的默认值是什么)
- 数据库托管在SSD卷上。
- 通过管理Web UI的"数据浏览器"提交查询。
- "名称"是一个自动索引字段。
- CPU使用率非常低-平均在8个内核中占20%。
- 我还没有深入剖析Neo4J服务器的性能-我的第一次尝试锁定了VisualVM。
那可能是路径的组合爆炸,您想尝试一下吗?
1 2 3 | start n=NODE(<id of a single node of interest>),m=node:node_auto_index("name:*") match shortestPath((n)-[*]->(m)) return m.name |
没有最短路径,它看起来像那样,但是由于您只对
1 2 3 | start n=NODE(<id of a single node of interest>),m=node:node_auto_index("name:*") match (n)-[*]->(m) return distnct m.name |
尝试查询-https://code.google.com/p/gueryframework/-这是一个独立的库,但具有neo4j适配器。也就是说,您将必须以查询格式重写查询。
更好地支持传递闭包是开发查询的主要原因之一,我们主要在需要可达性/模式分析的软件分析工具中使用此功能(例如,http://xplrarc.massey.ac.nz/中的反模式查询是使用查询计算得出)。
Google neo4j小组对此进行了简短的讨论:
https://groups.google.com/forum/#!searchin/neo4j/jens/neo4j/n69ksEJxDtQ/29DNKyWKur4J
还有一个(较旧的,未维护的)项目,带有一些基准测试代码:
https://code.google.com/p/graph-query-benchmarks/
干杯,詹斯