我有一个数据库与9537节点和52846关系。节点和关系都具有索引的属性。如何优化嵌套的Cypher查询?
我运行针对该数据库许多查询具有或多或少的格式如下:
START n0 = node:my_nodes(label='2'), n4 = node:my_nodes(label='2')
MATCH n0-[r0]-n4
WITH n0, n4, r0
MATCH n0-[r1]-n3
WHERE r1.lab - r0.lab = 0 and n3.label = 0 and id(r1) <> id(r0)
WITH n0, n4, n3, r0, r1
MATCH n0-[r2]-n2
WHERE r2.lab - r0.lab = 0 and n2.label = 2 and id(r2) <> id(r0) and id(r2) <> id(r1)
WITH n0, n4, n3, n2, r0, r1, r2
MATCH n0-[r3]-n1
WHERE r3.lab - r0.lab = -1 and n1.label= 0 and id(r3) <> id(r0) and id(r3) <> id(r1) and id(r3) <> id(r2)
RETURN id(n0), r0.lab, r1.lab, r2.lab, r3.lab;
相反属性值的具体数值(既为节点和关系),我有参数,这些参数的变化。 MATCH的结构也发生变化。
我现在的问题是,如果java没有达到内存限制,查询运行超过30分钟。
有没有一种方法来优化这种查询? 我是否需要调整一些配置设置以提高性能?
PS:我在FreeBSD上使用neo4j-1.9-RC2(linux发行版在那里运行)。 内存配置:
wrapper.java.initmemory=512
wrapper.java.maxmemory=8192
我认为这是与如何工作,但我敢肯定它实际上是懒惰的,这意味着它更像是一个管道发送结果一路走过来的结束,直到最终的回归迭代完成(除非你需要排序,或者做一些使其不可能的事情)。不过,你的论点的短路部分仍然有效。 –
WITH是懒惰它不预先计算的东西,除非当你使用'order by','distinct'或聚合 –
以前我正在写密码查询的方式@ ean5533建议,但我想通过'WITH'查询表现更快。我会尝试现在不同的组合。这与我在“START”中放入多少个节点有关系吗?把'n0'放在'START'里,其余的放在'WHERE'里过滤出来会更好吗? – npobedina