简单的Neo4j查询在大型数据库上非常慢

时间:2016-04-10 13:52:22

标签: neo4j cypher

我有一个具有以下属性的Neo4J数据库:

  • Array Store 8.00 KiB
  • Logical Log 16 B
  • 节点商店174.54 MiB
  • 物业商店477.08 MiB
  • Relationship Store 3.99 GiB
  • String Store Size 174.34 MiB
  • MiB总店铺面积5.41 GiB

有12M节点和125M关系。

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

我的操作系统是Windows 10 64位,在Intel i7-4500U CPU @ 1.80Ghz上运行,内存为8GB。 这不是一个完整的强国,但它是一台不错的机器,理论上整个商店甚至可以装进RAM。

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

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

我得到了一个结果:

Returned 1 row in 17445 ms.

我还使用了与http://localhost:7474/db/data/cypher相同查询的帖子请求,这花费了19秒。

这样的事情: http://localhost:7474/db/data/node/15000 然而,在23ms执行...

我可以确认标题上有一个索引:

Indexes
ON :Page(title) ONLINE 

所以任何人都有关于为什么这么慢可能运行的想法?

谢谢!

1 个答案:

答案 0 :(得分:6)

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

要进一步扩展它 - INDEX ON:页面(标题)仅适用于具有:Page标签的节点,并且为了利用该索引,您的MATCH()需要在其搜索中指定该标签。

如果指定的MATCH()没有标签,则查询引擎没有"线索"您正在寻找的内容,因此必须执行完整的数据库扫描才能找到具有 title 属性的所有节点并检查其值。

那是

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

花了这么长时间 - 它必须扫描整个数据库。

如果你告诉MATCH()你正在寻找一个带有:页面标签和标题属性的节点 -

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

查询引擎知道你正在寻找带有该标签的节点,它也知道它可以使用的标签上有一个索引 - 这意味着它可以用你的表现执行你的搜索&#39 ;寻找。