2016-04-10 35 views
1

很慢我有一个具有以下特性的Neo4j数据库:简单的Neo4j查询大型数据库

  • 阵列存储8.00昆明植物研究所
  • 逻辑日志16架B
  • 节点存储器174.54 MIB
  • 物业商店477.08 MiB
  • 关系商店3.99 GiB
  • 字符串商店大小174.34 MiB
  • MiB总店面尺寸5.41 GiB

有12M节点和125M关系。

所以你可以说这是一个非常大的数据库。

我的操作系统是Windows 10 64bit,运行在Intel i7-4500U CPU @ 1.80Ghz,内存为8GB。 这不是一个完整的强大的厂房,但它是一个体面的机器,理论上总店甚至可以装入内存。

然而,当我运行一个非常简单的查询(使用Neo4j的浏览器)

MATCH (n {title:"A clockwork orange"}) RETURN n; 

我得到一个结果:

Returned 1 row in 17445 ms. 

我还使用了一个POST请求使用相同的查询http://localhost:7474/db/data/cypher,这花了19秒。

是这样的: http://localhost:7474/db/data/node/15000 在23MS然而执行...

而且我可以证实存在于标题索引:

Indexes 
ON :Page(title) ONLINE 
为什么这可能是

因此,任何有想法运行如此缓慢?

谢谢!

回答

4

这必须扫描db中的所有节点 - 如果使用n:Page而不是n来重新运行查询,它将使用这些节点上的索引,并且会得到更好的结果。


要扩大这个多一点 - INDEX ON:页面(标题)仅适用于具有节点:标签页,并为将这一指标的优势,你的MATCH()需要指定在标签它的搜索。

如果没有标签指定MATCH(),查询引擎没有“线索”你在找什么,所以它必须做一个完整的数据库扫描,以找到所有节点标题财产并检查其价值。

这就是为什么

MATCH (n {title:"A clockwork orange"}) RETURN n; 

是这么长时间 - 它扫描整个数据库。

如果你告诉MATCH()你正在寻找一个节点:页面标签和标题财产 -

MATCH (n:Page {title:"A clockwork orange"}) RETURN n; 

查询引擎知道你正在寻找与标签节点,它也知道它可以使用该标签上的索引 - 这意味着它可以使用您要查找的性能来执行搜索。

+1

嗯,你是对的,我认为这不会有问题,因为只有页面节点在数据库中......这真棒我得到的结果约100毫秒! – ZaphodBBx