Neo4j查询监控/分析长时间运行的查询

3

我有一些长时间运行的查询。作为背景信息:我正在爬取我的图表,以查找特定元路径的所有实例。例如,计算在图表中找到的特定元路径的所有实例。

MATCH (a:Content)-[:isTaggedWith]-> (t:Term) <-[:isTaggedWith]-(b:Content) 返回 (*)

首先,我想测量运行时间。有没有可能这样做?特别是在社区版中吗?

此外,我有一个问题,我不知道查询是否仍在neo4j中运行,还是已经终止。我使用rest客户端发出查询,但如果必要,我可以使用其他选项。例如,我使用rest客户端查询neo4j,并将读取超时(客户端侧)设置为2天。问题是,我无法验证查询是否仍在运行,或者客户端是否只是等待neo4j答案,因为查询可能已在后端被终止。是否真的没有办法从浏览器或另一个客户端检查当前正在运行的查询?也许还可以选择终止它们。

先谢谢您!


一个查询在后台被杀死的原因是什么?就个人而言,我正在使用Bolt驱动程序从Java进程进行查询,并且测量查询时间就像记录查询的开始和结束时间一样容易。 - M. le Rutte
2个回答

3

测量查询性能

回答您的第一个问题,有两个主要选项来测量查询性能。第一个是使用PROFILE;将其放在查询前面(如PROFILE MATCH (a:Content)-[:IsTaggedWith]->(t:Term)...),它将执行查询并显示使用的执行计划,包括本机API调用、每个操作的结果数、总数据库命中次数和总执行时间。

缺点是PROFILE将执行查询,因此,如果它是对数据库进行写入的操作,则更改将被持久化。为了对查询进行分析而不执行它,可以使用EXPLAIN代替PROFILE。这将显示将用于执行查询的查询计划和本机操作,以及预计的总数据库命中次数,但它不会实际运行查询,因此仅仅是一种估计。

检查长时间运行的查询(仅企业版)

可以使用Cypher在Enterprise Edition中检查正在运行的查询:CALL dbms.listQueries;。您必须以管理员用户身份登录才能执行该查询。如果您想停止长时间运行的查询,请使用CALL dbms.killQuery()并传递您希望终止的查询的ID。

请注意,除了手动终止查询和基于配置的查询超时之外,在通常情况下,查询不应该在后台被终止;但是,使用上述方法,您可以双重检查发送后是否确实执行了查询。

这些仅在Enterprise版中提供;我不知道有没有办法在Community版中使用这些功能或复制它们的行为。


非常感谢您详细的回答。但是,我的假设是否正确,即listQueries()和killQuery()命令仅在企业版中可用? - Janukowitsch
很抱歉问个菜鸟问题:) 但是我应该从哪里调用列表查询命令等?我尝试通过neo web浏览器以及通过neo4j webadmin控制台来执行此操作。但是,调用命令无法被识别。 - Janukowitsch
@Janukowitsch,你说得对,这些只在企业版中可用。我已经更新了我的答案以反映这一点。假设它们是可用的,你可以在任何可以输入Cypher的地方使用它们;在Web界面上,在Bolt上,在REST API上... - Rebecca Nelson

0

为了测量长时间运行的查询,我想出了以下方法:

  1. 使用 tmux (tmux crash course) 终端会话,这非常容易。您可以在此执行查询并关闭终端。稍后您可以重新获取会话。

    • 新建会话:tmux new -s *sessionName*
    • 从当前会话中分离:tmux detach
    • 列出会话:tmux ls
    • 重新附加到会话:tmux a -t *sessionName*
  2. 在 tmux 会话中,通过 cypher shell 执行查询。可以直接在 shell 中执行,也可以将命令传递到 shell 中。后者更可取,因为您可以使用 unix 命令 time 来实际测量运行时间,如下所示:

    time cat query.cypher | cypher-shell -u neo4j -p n > result.txt

文件query.cypher只包含常规查询,末尾有终止分号。查询结果将被传输到result.txt中,并且执行时间将显示在终端中。

此外,仅在企业版中才能列出正在运行的查询,正如@rebecca所述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接