Neo4j - 查询性能下降

Neo4j - query performance degradation

这是我的查询:

MATCH (p:Publisher)-[r:PUBLISHED]->(w:Woka)-[s:AUTHORED]-(a:Author) 
MATCH (l:Language)-[t:USED]->(w:Woka) 
WHERE (a.author_name =~ '.*Camus.*' and a.author_name =~ '.*Albert.*') 
RETURN p.publisher_name, w.woka_title, a.author_name, l.language_name;

第一次执行3.8秒返回结果。几分钟后第二次执行,结果在 15.1 秒内返回。我执行的越多,响应时间就越长。对于第三次执行,响应时间在增加,几分钟后我得到的结果在 30 到 90 秒之间。

我是这个(开发)数据库的唯一用户。那里没有添加、删除或更改任何数据。那里也没有删除或创建索引。 当关闭与数据库的三个连接中的两个时,响应时间回到 15 秒。

初始内存设置为 4GB,最大为 8GB。服务器有 16GB 总内存。

这里发生了什么?为什么响应时间相差这么大?

你的图表有多大?可能是它为缓存分配了大量堆,然后没有足够的 space 用于 运行 没有垃圾收集的查询。

我假设你们的关系都是1:n,如果不是的话在两个匹配之间添加一个WITH distinct p,w,a

您的查询也不是最优的,可能会产生很多中间结果,您可以使用PROFILE查看查询计划。

试试这个:

PROFILE
MATCH (a:Author)
WHERE (a.author_name =~ '.*Camus.*' and a.author_name =~ '.*Albert.*') 
MATCH (p:Publisher)-[:PUBLISHED]->(w:Woka)<-[:AUTHORED]-(a)
MATCH (l:Language)-[:USED]->(w:Woka) 
RETURN p.publisher_name, w.woka_title, a.author_name, l.language_name;

我借鉴了其他解决方案,并在文件 conf/neo4j.properties 中更改了如下参数(之后服务器重新启动):

neostore.nodestore.db.mapped_memory=512M
neostore.relationshipstore.db.mapped_memory=512M
neostore.propertystore.db.mapped_memory=512M
neostore.propertystore.db.strings.mapped_memory=512M
neostore.propertystore.db.arrays.mapped_memory=512M

现在返回结果的速度平均快了 300%,时间从 90 秒缩短到 30 秒,而且我不再从 Web 界面与数据库断开连接。