长 运行 查询的 Neo4j 查询监控/分析
Neo4j query monitoring / profiling for long running queries
我有一些很长的 运行 查询。正如背景信息一样:我正在为特定元路径的所有实例抓取我的图形。例如,计算图中找到的特定 metha 路径的所有实例。
MATCH (a:Content) - [:isTaggedWith]-> (t:Term) <-[:isTaggedWith]-(b:Content) return (*)
首先,我想测量运行时间。有没有可能这样做?特别是在社区版?
此外,我有一个我不知道的问题,在 neo4j 中查询是否仍然是 运行 或者它是否已经终止。我从休息客户端发出查询,但如有必要,我愿意接受其他选项。例如,我使用休息客户端查询 neo4j,并将读取超时(客户端)设置为 2 天。问题是,我无法验证查询是否仍然是 运行 或者客户端是否只是在等待 neo4j 答案,它永远不会出现,因为查询可能已经在后端被终止。真的没有可能从浏览器或其他客户端检查当前哪些查询是 运行 吗?也许也可以选择终止它们。
提前致谢!
测量查询性能
要回答您的第一个问题,有两个主要选项可用于衡量查询的性能。第一种是使用PROFILE
;把它放在查询前面(如PROFILE MATCH (a:Content)-[:IsTaggedWith]->(t:Term)...
),它会执行查询并显示使用的执行计划,包括本地API调用、每个操作的结果数、数据库总数点击次数和总执行时间。
缺点是PROFILE
会执行查询,所以如果是写数据库的操作,修改会被持久化。要在不实际执行查询的情况下分析查询,可以使用 EXPLAIN
而不是 PROFILE
。这将显示将用于执行查询的查询计划和本机操作,以及估计的总数据库命中率,但它实际上不会 运行 查询,因此它只是一个估计值。
检查长 运行 查询(仅限企业)
检查 运行ning 查询可以使用企业版中的 Cypher 完成:CALL dbms.listQueries;
。您必须以管理员用户身份登录才能执行查询。如果您想停止长运行ning 查询,请使用CALL dbms.killQuery()
并传入您希望终止的查询的ID。
请注意,除了根据配置的查询超时手动终止查询和超时之外,除非您设置了其他设置来终止长运行ners,否则查询通常不会在后端被杀死;但是,使用上述方法,您可以仔细检查您的假设,即查询确实在发送后执行。
这些仅适用于企业版;据我所知,无法在社区中使用这些功能或复制它们的行为。
为了测量长 运行 查询,我想出了以下方法:
使用 tmux (tmux crash course) 终端会话,这真的很容易。因此,您可以执行查询并关闭终端。稍后您可以恢复会话。
- 新会话:
tmux new -s *sessionName*
- 从当前会话中分离(在会话中):
tmux detach
- 列出会话:
tmux ls
- 重新附加到会话:
tmux a -t *sessionName*
在 tmux 会话中,通过密码 shell 执行查询。直接在 shell 中或将命令通过管道传递到 shell 中。阶梯方法更可取,因为您可以使用 unix 命令时间来实际测量运行时间,如下所示:
时光猫query.cypher |密码-shell -u neo4j -p n > result.txt
文件query.cypher 简单地包含常规查询,包括末尾的终止分号。查询结果将通过管道传输到 result.txt,执行的运行时间将显示在终端中。
此外,正如@rebecca 所正确指出的那样,可以在企业版中列出 运行 查询 仅 。
我有一些很长的 运行 查询。正如背景信息一样:我正在为特定元路径的所有实例抓取我的图形。例如,计算图中找到的特定 metha 路径的所有实例。
MATCH (a:Content) - [:isTaggedWith]-> (t:Term) <-[:isTaggedWith]-(b:Content) return (*)
首先,我想测量运行时间。有没有可能这样做?特别是在社区版?
此外,我有一个我不知道的问题,在 neo4j 中查询是否仍然是 运行 或者它是否已经终止。我从休息客户端发出查询,但如有必要,我愿意接受其他选项。例如,我使用休息客户端查询 neo4j,并将读取超时(客户端)设置为 2 天。问题是,我无法验证查询是否仍然是 运行 或者客户端是否只是在等待 neo4j 答案,它永远不会出现,因为查询可能已经在后端被终止。真的没有可能从浏览器或其他客户端检查当前哪些查询是 运行 吗?也许也可以选择终止它们。
提前致谢!
测量查询性能
要回答您的第一个问题,有两个主要选项可用于衡量查询的性能。第一种是使用PROFILE
;把它放在查询前面(如PROFILE MATCH (a:Content)-[:IsTaggedWith]->(t:Term)...
),它会执行查询并显示使用的执行计划,包括本地API调用、每个操作的结果数、数据库总数点击次数和总执行时间。
缺点是PROFILE
会执行查询,所以如果是写数据库的操作,修改会被持久化。要在不实际执行查询的情况下分析查询,可以使用 EXPLAIN
而不是 PROFILE
。这将显示将用于执行查询的查询计划和本机操作,以及估计的总数据库命中率,但它实际上不会 运行 查询,因此它只是一个估计值。
检查长 运行 查询(仅限企业)
检查 运行ning 查询可以使用企业版中的 Cypher 完成:CALL dbms.listQueries;
。您必须以管理员用户身份登录才能执行查询。如果您想停止长运行ning 查询,请使用CALL dbms.killQuery()
并传入您希望终止的查询的ID。
请注意,除了根据配置的查询超时手动终止查询和超时之外,除非您设置了其他设置来终止长运行ners,否则查询通常不会在后端被杀死;但是,使用上述方法,您可以仔细检查您的假设,即查询确实在发送后执行。
这些仅适用于企业版;据我所知,无法在社区中使用这些功能或复制它们的行为。
为了测量长 运行 查询,我想出了以下方法:
使用 tmux (tmux crash course) 终端会话,这真的很容易。因此,您可以执行查询并关闭终端。稍后您可以恢复会话。
- 新会话:
tmux new -s *sessionName*
- 从当前会话中分离(在会话中):
tmux detach
- 列出会话:
tmux ls
- 重新附加到会话:
tmux a -t *sessionName*
- 新会话:
在 tmux 会话中,通过密码 shell 执行查询。直接在 shell 中或将命令通过管道传递到 shell 中。阶梯方法更可取,因为您可以使用 unix 命令时间来实际测量运行时间,如下所示:
时光猫query.cypher |密码-shell -u neo4j -p n > result.txt
文件query.cypher 简单地包含常规查询,包括末尾的终止分号。查询结果将通过管道传输到 result.txt,执行的运行时间将显示在终端中。
此外,正如@rebecca 所正确指出的那样,可以在企业版中列出 运行 查询 仅 。