为什么具有密码的Neo4j新索引系统的性能比指定起点要差得多?

时间:2013-12-17 07:17:13

标签: neo4j cypher

我有相同概念查询的以下版本:

i)个

START a=node(1) MATCH (a)<-[:R]-(:B)<-[:S]-(:C)<-[:T]-(:D)<-[:U]-(e:E)
WHERE e.Property = "Value" WITH e SKIP 20 LIMIT 20 RETURN e ORDER BY e.Id;

ⅱ)

MATCH (a:A { Id: 1}) WITH a MATCH (a)<-[:R]-(:B)<-[:S]-(:C)<-[:T]-(:D)
<-[:U]-(e:E) WHERE e.Property = "Value" WITH e SKIP 20 LIMIT 20 RETURN e ORDER BY e.Id;

ⅲ)

MATCH (a:A {Id : 1})<-[:R]-(:B)<-[:S]-(:C)<-[:T]-(:D)<-[:U]-(e:E)
WHERE e.Property = "Value" WITH e SKIP 20 LIMIT 20 RETURN e ORDER BY e.Id;

我还在Id上为A创建了一个索引:CREATE INDEX ON :A(Id)

节点总数在几十万到二百万之间。该系统上的关系和节点基本上在根级别创建了孤立的树(在本例中为A类节点)。

如果我运行查询i)我得到的响应范围为31 ms到100 ms。

如果我运行查询ii)我可能会在1500毫秒到10000毫秒之间得到响应(在系统延迟将节点加载到内存之前达到最大响应时间。)

如果我运行查询iii)我通过网络界面获得超时。

很明显,通过跳过索引系统(节点(1)与匹配并获取节点),我应该期待更快的响应,但需要一个数量级?

此外,如果我只做MATCH (a:A {Id: 1}) RETURN a;,我可能得到16 ms的响应,这些响应非常接近或几乎完全相同,而不仅仅是指定起点。

使用USING INDEX暗示系统对性能没有任何影响。

我的Cypher查询错了吗?

2 个答案:

答案 0 :(得分:0)

你试过吗

匹配(a:A {Id:1})&lt; - [:R] - (:B)&lt; - [:S] - (:C)&lt; - [:T] - (:D) &lt; - [:U] - (e:E {property =“Value”}) 用e SKIP 20 LIMIT 20返回e .Id;

我相信这是自2.0以来的新方式......

里克多维

答案 1 :(得分:0)

问题在于我使用的是Neo4j 2.0.0M3。

通过安装2.0.0 final解决了这个问题。