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

Zap*_*BBx 2 neo4j cypher

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

  • Array Store 8.00 KiB
  • 逻辑日志16 B
  • 节点存储174.54 MiB
  • 物业商店477.08 MiB
  • 关系店3.99 GiB
  • 字符串存储大小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;
Run Code Online (Sandbox Code Playgroud)

我得到一个结果:

Returned 1 row in 17445 ms.
Run Code Online (Sandbox Code Playgroud)

我还使用了对http:// localhost:7474/db/data / cypher 进行相同查询的post请求,这需要19秒.

像这样的东西: http:// localhost:7474/db/data/node/15000 然而在23ms执行...

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

Indexes
ON :Page(title) ONLINE 
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Tim*_*ehn 6

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


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

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

这就是为什么

MATCH (n {title:"A clockwork orange"}) RETURN n;
Run Code Online (Sandbox Code Playgroud)

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

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

MATCH (n:Page {title:"A clockwork orange"}) RETURN n;
Run Code Online (Sandbox Code Playgroud)

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