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

时间:2018-04-14 10:25:09

标签: neo4j monitoring

我有一些相当长时间运行的查询。就像abckground信息一样:我正在抓取我的图表以获取特定元路径的所有实例。例如,计算图表中找到的特定甲型路径的所有实例。

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

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

此外,我遇到的问题是,我不知道,查询是否仍在neo4j中运行,或者它是否已经终止。我从休息客户端发出查询,但如果有必要,我可以使用其他选项。例如,我使用rest客户端查询neo4j并在2天内设置读取超时(客户端)。问题是,我无法验证查询是否仍在运行,或者客户端是否只是在等待neo4j应答,这将永远不会出现,因为查询可能已经在后端被杀死了。是否真的无法从浏览器或其他客户端检查当前正在运行哪些查询?也许可以选择终止它们。

提前致谢!

2 个答案:

答案 0 :(得分:2)

衡量查询效果

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

缺点是PROFILE将执行查询,因此如果它是写入数据库的操作,则更改将保持不变。要在不实际执行查询的情况下对查询进行概要分析,可以使用EXPLAIN代替PROFILE。这将显示将用于执行查询的查询计划和本机操作,以及估计的总数据库命中数,但它实际上不会运行查询,因此它只是一个估计值。

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

可以使用企业版中的Cypher CALL dbms.listQueries;来检查运行查询。您必须以管理员用户身份登录才能执行查询。如果要停止长时间运行的查询,请使用CALL dbms.killQuery()并传入要终止的查询的ID。

请注意,除了根据配置的查询超时手动查询查询和超时之外,除非您设置其他东西来杀死长跑者,否则查询通常不会在后端被杀死;但是,使用上述方法,您可以仔细检查在发送后查询确实正在执行的假设。

这些仅在Enterprise Edition中可用;我无法使用这些功能或在社区中复制他们的行为。

答案 1 :(得分:0)

对于衡量长期运行的查询,我想出了以下方法:

  1. 使用tmux(tmux crash course)终端会话,这确实非常容易。因此,您可以执行查询并关闭终端。稍后,您可以返回会话。

    • 新会话:tmux new -s *sessionName*
    • 从当前会话(在会话内)分离:tmux detach
    • 列出会话:tmux ls
    • 重新连接到会话:tmux a -t *sessionName*
  2. 在tmux会话中,通过密码外壳执行查询。直接在外壳中或将命令通过管道传递到外壳中。最好使用梯形图方法,因为您可以使用unix命令时间来实际测量运行时,如下所示:

    时间猫query.cypher | cypher-shell -u neo4j -p n> result.txt

文件query.cypher仅包含常规查询,包括结尾处的分号。查询的结果将通过管道传送到result.txt中,执行的运行时间将显示在终端中。

此外,可以按@rebecca的正确说明在企业版中仅列出正在运行的查询。