Neo4j Cypher查询传递闭包性能不佳

时间:2014-01-28 00:58:17

标签: neo4j cypher

我有一个~89K节点和~1.2M关系的图形,我试图通过以下Cypher查询获得单个节点的传递闭包:

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卷上。
  • 通过管理员网站用户界面的“数据浏览器”提交查询。
  • “name”是一个自动编入索引的字段。
  • CPU使用率相当低 - 平均占8个核心的20%。
  • 我还没有深入剖析Neo4J服务器 - 我的第一次尝试锁定了VisualVM。

2 个答案:

答案 0 :(得分:4)

这可能是路径的组合爆炸,小心试试这个?

start n=NODE(<id of a single node of interest>),m=node:node_auto_index("name:*")
match shortestPath((n)-[*]->(m))
return m.name

没有最短路径它看起来像那样,但是因为你只对来自n的可到达节点感兴趣,所以上面应该足够了。

start n=NODE(<id of a single node of interest>),m=node:node_auto_index("name:*")
match (n)-[*]->(m)
return distnct m.name

答案 1 :(得分:0)

尝试查询 - https://code.google.com/p/gueryframework/ - 这是一个独立的库,但有一个neo4j适配器。即,您必须以查询格式重写查询。

更好地支持传递闭包是开发查询的主要原因之一,我们主要在软件分析工具中使用它,我们需要可达性/模式分析(例如,http://xplrarc.massey.ac.nz/中的反模式查询是使用查询计算的)

neo4j google小组对此进行了简短的讨论: https://groups.google.com/forum/#!searchin/neo4j/jens/neo4j/n69ksEJxDtQ/29DNKyWKur4J

和一个(较旧的,未维护的)项目,其中包含一些基准代码:

https://code.google.com/p/graph-query-benchmarks/

干杯,詹斯