我有一个~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
不幸的是,这个查询消失了,似乎没有回来(虽然公平地说我现在只给它一小时的执行时间)。
有关如何优化我在此处所获得的建议,或者更好的方法来实现这一要求?
注意:
答案 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/
干杯,詹斯