neo4j cypher_优化Neo4j Cypher查询

neo4j cypher

上周,我花了很多时间来尝试优化大约20个使用实时系统数据执行的灾难性的Cypher查询(36866ms至155575ms)。 经过一番尝试和错误,以及来自Michael的大量投入,我能够大致确定对查询进行哪些操作才能使它们性能更好-最后,性能最差的查询降至521ms。冷图和1GB堆空间(并且该查询具有可选路径-不确定如何改进),其余都在50ms以下-与原始数字相比有很大改进。

希望这可能对其他人有所帮助,这就是我所做的事情(大多数是猜测工作,并且在很大程度上是不科学的)-也许Michael可以帮助解释内部原理,并根据某些假设对我进行纠正。 我要做的第一件事是确保每个密码查询都使用参数-如Neo4j文档中所述 ,这有助于缓存执行计划。

其次,我在Neo4j邮件列表中碰到了一个帖子,迈克尔在其中提到不重新实例化ExecutionEngine,以便上述参数化查询实际上可以缓存。 对于许多人来说,这似乎很明显,但这是一个容易被忽视的事实,因为我有一个名为QueryExecutor的类,该类包含一个执行带有参数映射的查询的方法,并且该方法为每个查询创建了一个新的ExecutionEngine。 一旦编写并多次使用了此方法,就很容易忘记。 但是,这是影响整体性能的一个非常重要的因素(文档中的提及将非常有帮助),它解释了为什么即使在参数化的情况下,我的查询通常也需要花费相同的时间来执行。 将其更改为使用缓存的ExecutionEngine,可以看到我的查询时间工作表的下半部分下降了……在缓存之后0到1毫秒-取得了出色的进展。

现在,要开始每个查询,从最坏的情况开始。 我决定在仅分配1GB堆空间的本地计算机上和冷图上进行优化。 因此,我忽略了缓存后查询执行的改进-我认为这是确保进度的一种更好的方法-如果第一个查询命中没有改善,那么您确实没有对其进行优化。 这样,如果它在有限的硬件上确实可以很好地工作,我对它在生产中可以更好地工作充满信心。

除了在代码中安排查询时间之外,我还使用webadmin控制台进行了优化。 该查询糟糕的指标是它不会返回并且控制台将挂起。 优化以使其不会挂起本身就是一个重大改进。 高度不科学,但我建议这样做。

我的第一个查询平均大约为76558ms(该时间是通过在引擎execute方法周围添加开始时间和结束时间而获得的)。 第一次优化后,它减少到466ms。 这是原始查询: https : //gist.github.com/4436272

这是经过优化的一个: https ://gist.github.com/4436281不需要执行此巨大匹配只是为了基于a的alertDate属性过滤出结果,因此我减少了匹配以返回最小的集合首先可以过滤的数据,即 通往的道路
如果要在第一次匹配之前执行错误查询,则会看到返回2万行之类的信息。 过滤后,它们只有450个奇数行。 可以想象,第二个查询Swift减少了可能要使用的结果数量。

第二个变化是我那天从迈克尔那里学到的东西,当时我问做大型比赛还是继续修剪子查询是否有意义。 他的回答是:“ 问题是,您是在使用match来通过描述模式来实际扩展结果集,还是只是要确定是否存在某些关系(也称为“过滤”)。 如果是后者,则可能要在where子句中使用path-expression语法。

WHERE a-[:FOO]->b
or WHERE NOT(a-[:FOO]->b)'

这花了一点时间来适应,因为我编写MATCH子句的方式恰恰是我脑子里的想法,但是现在我可以区分出所需结果的匹配项与过滤器的匹配项了。 在上面的查询中,我的结果中需要(ir),因此无需在匹配中包含(a)-[:alert_for_inspection]->(i); 我可以在WHERE中使用它来确保a确实与i有关。

这是另一个示例: https : //gist.github.com/4436293

立刻,您会看到我们按日期过滤了厘米关系-如果它们不在日期范围内,则无需我们先进行匹配。 因此,查询的这一部分可以重写为:

start c=node:companies(id={id})
match c <-[parent_company*0..]-(n)with n
match n-[:defines_business_process]->(bp)-[:has_cycle]->(cm)
where cm.measureDate>={measureStartDate} and cm.measureDate<={measureEndDate}

在那之后,下一个过滤器是相同的:

with cm
match (cm)-[:cycle_metric] ->m-[:metric_activity] ->ma-[:metric_unit] -> (u)-[:alert_for_unit]-(a) where a.alertDate=cm.measureDate and a.fromEntityType={type}

这进一步修剪了我们的结果集。 最后,将连接添加到r(以得到我们的结果),确保没有导致r产生但必不可少的路径进入WHERE子句:

with a,ma
match (r) < - [:for_inspection_result]-a-[:alert_for_inspection]- > i
where (i) < -[:metric_inspection]-(ma)
return a.id as alertId, r.value as resultValue

这是完整的查询: https ://gist.github.com/4436328原始时间-33360毫秒,优化后-246毫秒。

至少对我来说,我的大多数查询都属于这种模式,所以到第二天,我就能够非常快速地重构它们。 有趣的是,此后,我仍然感到响应缓慢,但是在日志中打印的查询时间很小。 消除之后,我发现我的代码在执行查询之后(由executionEngine.execute)实际上停留了很长时间,但是在结果集的第一次迭代中。我假设结果不一定在execute()方法期间收集,但是在结果集的迭代中比较懒惰-我不了解Cypher内部结构,因此我可能完全错了。 但是定时迭代本身可以指出更糟糕的查询。

其他点点滴滴-ORDER BY增加了很多时间。 如果没有它,那是您应该放弃的第一件事。 DISTINCT还增加了时间,但是在我的许多情况下,很难删除它。

如果要检查是否缺少可选路径,通常在哪里进行MATCH(u)-[r?:has_a]-(a)WHERE NOT(r为null),而是改写为MATCH(u)-[ other_stuff]-.. WHERE NOT(u-[:has_a] -a)的效果要好得多。 但是,在我有诸如MATCH X- [o?:optional] -Y WHERE(存在o,将Y匹配到A和B)或OR(不存在o,将X匹配到c和d)的可选路径的地方,我无法简化与没有可选路径的其他查询相比,这些查询仍需要一些时间。

最终-发现问题的时间太晚了,因为测试数据永远不会与实时数据非常接近。 图的结构起着很大的作用-一些节点是紧密连接的,而其他节点则不是那么重要-并且涉及那些紧密连接的节点的查询是对我们最大的伤害。 尽可能尝试使用生产质量数据进行性能测试,或者尝试创建与之类似的测试数据。

因此,总结一下:

  1. 始终参数化您的查询
  2. 缓存ExecutionEngine
  3. 找出您要过滤的内容,并尽早使用所涉及的匹配最少的过滤器,以便在进一步查询时结果集逐渐变小。 持续测量每个子查询中返回的时间和结果,以便您可以确定在过滤器不明显时首先执行的操作
  4. 检查您的MATCH和RETURN子句-在MATCH中仅包括RETURN所需的那些部分。 剩下的将用于过滤结果的信息可以进入WHERE
  5. 如果您不需要ORDER BY,请昨天放下
  6. 如果您不需要DISTINCT,也要摆脱它
  7. 如果不需要基于可选路径的检查,可以将检查是否存在可选路径从MATCH移到WHERE中
  8. 不仅要花费查询的execute(),还要花费时间迭代结果
  9. 如果您的Webadmin控制台挂起,则说明您做的不好。 删除查询的各个部分以找出有问题的部分。
  10. 尝试尽可能使用实时数据
  11. 在资源不佳的冷图上进行测试-当您看到生产中的图形滑过您时,您会感觉好多了!

参考: Thought Bytes博客上来自我们JCG合作伙伴 Aldrin和Luanne Misquitta的优化Neo4j Cypher查询 。

翻译自: https://www.javacodegeeks.com/2013/01/optimizing-neo4j-cypher-queries.html

neo4j cypher

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac--PHP已经开启gd扩展验证码不显示

错误显示&#xff1a;Call to undefined function imagettftext() 原因&#xff1a; mac系统中自带的php的gd库中&#xff0c;缺少对freetype的支持&#xff0c;导致图片无法显示。 解决&#xff1a; 1 下载freetype&#xff0c;安装即可 下载地址&#xff1a;https://download…

cprintdialog预览_怎样用CPrintDialog来实现打印功能

把以下程序段加入你的程序把dc1当作Device Content.就任你打印了.注意别画错地方.自己换页.更绝的是可调用窗口的OnPrint或OnDraw成员函数直接打印.不用你去做行距多少啦!但别忘换页.// 打印// 建立打印对话框对象CPrintDialoghttp://www.gaodaima.com/?p65323怎样用CPrintDia…

容器中Java RAM的使用:不会丢失内存的5大技巧

在本文中&#xff0c;我们希望分享Java内存管理的细节和容器内部的弹性&#xff0c;这些细节乍一看并不明显。 在下面&#xff0c;您将找到要注意的问题列表以及即将发布的JDK版本中的重要更新&#xff0c;以及针对核心痛点的现有解决方法。 我们收集了5个最有趣&#xff0c;最…

G1垃圾收集器设计目标与改良手段【纯理论】

在之前已经详细对CMS垃圾回收器进行了学习&#xff0c;今天准备要学习另一个全新的垃圾收集器---G1&#xff08;Garbage First Collector 垃圾优先的收集器&#xff09;&#xff0c;说是一种全新的&#xff0c;其实G1垃圾收集器已经出现了N多年了&#xff0c;只是从发展到成熟是…

centos7安装es mysql_Centos7 安装MySQL详细步骤

Centos7 安装MySQL详细步骤首先在虚拟机中安装一个Centos7(VM虚拟机安装Centos7)1.1 MySQL安装1.1.1 下载wget命令yum -y install wget11.1.2 在线下载mysql安装包wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm11.1.3 安装MySQLrpm -ivh mysql57…

Mac入门--通过homebrew下载过慢问题

使用国内的镜像替换homebrew镜像&#xff0c;对镜像进行加速源 原先我们执行brew命令安装的时候&#xff0c;跟3个仓库地址有关 1 brew.git 2 homebrew-core.git 3 homebrew-bottles 把三个仓库地址全部替换成国内Alibaba提供的地址 1 替换/还原brew.git仓库地址 # 替换成阿里…

在卷积层的运用_Conv 卷积层

onv 卷积层一.why CNN for image ? 1.Some Patterns are much smaller than the whole image.一些模式比起整张图片来说更小&#xff0c;即寻找模式不用看完整的图像。2.The same patterns appear in different regions.同一个模式可能会出现在不同的区域。3.Subsamping the p…

idea 编写javafx_用JavaFX编写图块引擎

idea 编写javafx随着JavaFX嵌入式版本的问世&#xff0c;我们的框架对于游戏开发变得越来越有趣&#xff0c;因为我们现在可以瞄准平板电脑和智能手机等小型消费类设备。 因此&#xff0c;我决定对JavaFX进行更多的游戏编写实验。 这次&#xff0c;我想使用Canvas对渲染进行更多…

C#/.Net操作MongoDBHelper类

先 NuGet两个程序集 1:MongoDB.Driver、 2:MongoDB.Bson namespace ConsoleApp1{ /// <summary> /// MongoDb帮助类 /// </summary> /// <summary> /// MongoDb帮助类 /// </summary> public class DB { private static readonly string connStr &q…

echo回声不能用了_已懂得用电子分频器,为何不继续加个效果器让音响效果更好?...

效果器是一种提供各种声场效果&#xff0c;并对声音信号在时间和频率等多方面多方位进行加工处理以产生特殊音响效果的周边设备&#xff0c;它广泛使用在电台、电视台的节目制作上。然而要充分发挥效果器的作用&#xff0c;使其获得满意的效果&#xff0c;还必须掌握正确的连接…

Spring Web-Flux – Cassandra后端的功能样式

在上一篇文章中&#xff0c;我介绍了Spring Web-Flux的基础知识&#xff0c;它表示Spring框架的Web层中的响应式支持。 我已经展示了使用Spring Data Cassandra并在Spring Web Layers中使用传统注释支持的端到端示例&#xff0c; 大致如下&#xff1a; ... import org.spring…

Mac入门--安装PHP扩展redis,swoole

1 php7以下可以通过pecl安装PHP扩展 安装redis扩展 pecl install redis 安装swoole扩展 pecl install swoole2 PHP7以上通过源码编译安装扩展 2.1 扩展安装包在官网上查找链接地址&#xff1a;http://pecl.php.net 2.2.1 在官网上直接下载上传的服务器上解压 2.2.2 通过wget下载…

商品pid是什么意思_0基础搞懂自动驾驶传统算法与深度学习的鸿沟-PID控制算法与MLP优化方法...

0基础搞懂自动驾驶传统算法与深度学习的鸿沟这个专题核心是要思考如何让rule-base的自动驾驶算法逐步提升为data-driven的算法&#xff0c;从而尽可能的提升软件的泛化性。数据驱动的逻辑代替控制&#xff0c;规划&#xff0c;定位&#xff0c;融合&#xff0c;感知以及替换整个…

1000以内完数c语言程序_C语言经典面试题目及答案详解(二)

接着上次来说&#xff0c;C语言经典面试题目及答案详解&#xff08;一&#xff09;当中大部分是一些概念和理解的东西 &#xff0c;今天说一说实践操作&#xff0c;有关c的经典程序。1、输出9*9口诀。共9行9列&#xff0c;i控制行&#xff0c;j控制列。#include "stdio.h&…

「题解」:[组合数学]:Perm 排列计数

题干&#xff1a; Description称一个1,2,…,N的排列P1,P2…,Pn是Magic的&#xff0c;当且仅当2<i<N时&#xff0c;Pi>Pi/2. 计算1&#xff0c;2&#xff0c;…N的排列中有多少是Magic的&#xff0c;答案可能很大&#xff0c;只能输出模P以后的值Input输入文件的第一行…

最受欢迎的java技术_最受欢迎的Java环境

最受欢迎的java技术该职位将是即将发布的系列文章中的第一篇。 我们从所使用的环境开始&#xff1a;如果您感兴趣的是最受欢迎的JVM供应商或JVM版本&#xff0c;那么32bit是比64bit更流行的体系结构&#xff0c;还是Windows 8比Windows XP更流行的体系结构-这些都将在我们的文章…

DT-06 For MQTT

感谢关注深圳四博智联科技有限公司产品&#xff01;我公司提供完整的WiFi信号强度采集方案&#xff0c;包括WiFi信号采集、设备远程管理平台、智能终端应用等。 Doit_MQTT透传固件基于乐鑫ESP_IOT_SDK使用C编写&#xff0c;代码执行效率高。经过多个版本迭代&#xff0c;可靠性…

@async 没有异步_扒一扒VueCLI3.0中Axios异步请求同步化

前台经常会遇到请求同步和异步的问题&#xff0c;今天咱们来聊一聊vue中同步请求和异步请求那些事儿。说到接口的请求同步和异步问题&#xff0c;最早接触Ajax中就存在&#xff0c;Ajax传递的参数有一个async&#xff0c;默认情况下是false&#xff0c;也就是异步传输的&#x…

Java Platform Module系统中的可选依赖项

Java平台模块系统&#xff08;JPMS&#xff09;对依赖项有很强的见解&#xff1a;默认情况下&#xff0c;需要&#xff08;必须可访问&#xff09;它们&#xff0c;然后在编译时和运行时都将它们存在。 但是&#xff0c;这不适用于可选的依赖项&#xff0c;因为代码是针对运行时…

sqoop导出solr数据_Apache Atlas - 强大的元数据管理工具

构建和安装Apache Atlas构建Apache Atlas下载 Apache Atlas 1.0.0 发行版源码, apache-atlas-1.0.0-sources.tar.gz, 从 downloads 下载. 然后按照以下说明构建Apache Atlas。tar xvfz apache-atlas-1.0.0-sources.tar.gz cd apache-atlas-sources-1.0.0/ export MAVEN_OPTS&qu…