我有一个具有以下属性的Neo4J数据库:
有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
所以任何人都有关于为什么这么慢可能运行的想法?
谢谢!
答案 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 ;寻找。