优化Neo4j Cypher查询

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

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

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

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

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

我的第一个查询平均大约76558毫秒(该时间是通过在引擎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

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

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

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

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

相关文章

python 多文件知识

对于一个大型的项目&#xff0c;会存在很多个py文件&#xff0c;本文记录与多文件有关的内容。 1. python 如何在一个.py文件中调用另一个.py文件的类 如果是在同一个 module中(也就是同一个py 文件里),直接用就可以如果在不同的module里,例如a.py里有 class A:b.py 里有 class…

android pick file,LFilePicker---文件选择利器,各种样式有它就够了

LFilePicker在 Android 开发中如果需要选择某个文件&#xff0c;可以直接调取系统的文件管理器进行选择&#xff0c;但是无法保证各个厂商的手机界面一致&#xff0c;而且解析Uri 还比较繁琐&#xff0c;如果还需要多选呢&#xff1f;需要文件类型过滤呢&#xff1f;老板说界面…

老笔记整理二:网页小问题汇总

最近有一些小问题。想在这里写出来。一是方便大家排错&#xff0c;再是自己也整理一下。 1。很傻的小问题。。。参数提交方式有一个应该是form而不是from。&#xff08;英语老师&#xff0c;我对不起你。。。&#xff09; 2。用超链接传参数&#xff0c;在&#xff1f;后面不能…

在JVM之下–类加载器

在许多开发人员中&#xff0c;类加载器是Java语言的底层&#xff0c;并且经常被忽略。 在ZeroTurnaround上 &#xff0c;我们的开发人员必须生活&#xff0c;呼吸&#xff0c;饮食&#xff0c;喝酒&#xff0c;并且几乎与类加载器保持亲密关系&#xff0c;才能生产JRebel技术&a…

matplotlib绘制饼状图

源自http://blog.csdn.net/skyli114/article/details/77508430?ticketST-41707-PzNbUDGt6R5KYl3TkWDg-passport.csdn.net pyplot使用plt.pie()来绘制饼图 1 import matplotlib.pyplot as plt 2 labels frogs, hogs, dogs, logs 3 sizes 15, 20, 45, 10 # [15,20,45,10…

自适应宽度元素单行文本省略用法探究

单行文本省略是现代网页设计中非常常用的技术&#xff0c;几乎每个站点都会用到。单行文本省略适用于显示摘要信息的场景&#xff0c;如列表标题、文章摘要等。在响应式开发中&#xff0c;自适应宽度元素单行文本省略容易失效不起作用&#xff0c;对网页开发这造成困扰。因此&a…

P3390 【模板】矩阵快速幂

题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A&#xff0c;求A^k 输入输出格式 输入格式&#xff1a; 第一行&#xff0c;n,k 第2至n1行&#xff0c;每行n个数&#xff0c;第i1行第j个数表示矩阵第i行第j列的元素 输出格式&#xff1a; 输出A^k 共n行&#xff0c;每行n个数&…

c#精彩编程200例百度云_永安市教育局被授予“人工智能编程教育试验区”

11月28日&#xff0c;“第二届人工智能与机器人教育大会青少年人工智能与编程教育主题论坛”在厦门召开。永安市教育局被中国教育发展战略学会人工智能与机器人教育专委会授予“人工智能编程教育试验区”牌匾&#xff0c;巴溪湾小学、西门小学、三中、一中附属学校、实验小学等…

python中+=和=+的区别

本文原创&#xff0c;版权属作者个人所有&#xff0c;如需转载请联系作者本人。Q&微&#xff1a;155122733 -------------------------------------------------------------------------------------------------------- a1 代表在原值上更改 aa1相当于先定义一个变量&…

Spring Data JPA和分页

让我们从支持分页的经典JPA方法开始。 考虑一个简单的域类–一个具有名字&#xff0c;姓氏的“成员”。 为了支持在成员列表上进行分页&#xff0c;JPA方法是支持一种查找器&#xff0c;该查找器将获取第一个结果&#xff08;firstResult&#xff09;的偏移量和要检索的结果&am…

南阳理工 题目63 小猴子下落

小猴子下落 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB 难度&#xff1a;3 描述 有一颗二叉树&#xff0c;最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3&#xff0c;&#xff0c;2的D次方减1。在结点1处放一个小猴子&#…

vue 方法获取返回值_vue.js - vuex异步提交,怎么获取返回数据

问 题 做登录页面时,在vuex中的action异步提交后获取的数据在mutations中存储在state里面,但是总感觉不对,没有返回数据,我前端页面怎么获取数据,用mapgetter获取不到数据,是不是他不是实时更新的,而且输出的mapgetter输出的数据还在action的前面。下面是我前端部分代码…

Windows环境下安装、卸载Apache

安装Apache 服务 打开 Apcahe的目录 &#xff0c;打开bin目录&#xff0c; 如&#xff1a;E:\wamp\Apache24\bin &#xff0c;打开目录&#xff0c;Shift键 鼠标右键 &#xff0c; 点击 在此处打开命令窗口或者W快捷键直接到此处&#xff0c; 也可以Window键r&#xff0c;输入…

css清浮动

我们在平常做项目的时候&#xff0c;float这个css属性经常会用到。元素浮动会让元素脱离文档流&#xff0c;从而不能撑开父级的内容。今天我将展示常见的清除浮动的方法。 什么是浮动 浮动元素脱离文档流并且向左或者向右移动&#xff0c;直到浮动元素的边缘碰到父级框或者另…

小心缓存管理器

如果使用spring和JPA&#xff0c;则很有可能利用ehcache&#xff08;或其他缓存提供程序&#xff09;。 您可以在两种不同的情况下进行此操作&#xff1a;JPA 2级缓存和spring方法缓存。 在配置应用程序时&#xff0c;通常会设置JPA提供程序的二级缓存提供程序&#xff08;在我…

DirectX11 学习笔记7 - 支持自由移动的摄像机

如今将又一次制定一个camera摄像机。能够自由移动。比方前进 后退&#xff0c;上游 下潜。 各个方向渲染之类的。 首先设置按键。 这个时候须要在 XWindow.h 里面 bool XWindow::frame() {//推断是否按下ESC键if(x_input->isKeyDown(VK_ESCAPE))return false;//假设A,S,D,W,…

腾讯吃鸡 android,腾讯吃鸡手游《光荣使命》正式上线:安卓/iOS不限号测试

IT之家11月29日消息 今天下午&#xff0c;腾讯首款百人战术竞技手游《光荣使命》在安卓、iOS双平台正式上线&#xff0c;开启全面测试。(官网下载&#xff1a;点此链接&#xff0c;双平台已开放下载。)该游戏采用第三人称射击视角&#xff0c;玩家化身参与“使命行动”军事演习…

lazada铺货模式的选品_lazada小白的运营难点→铺货与精细化运营的优劣势详解

lazada是铺货还是精细化经营第一种铺货铺货作为平台早期都是比较受欢迎的&#xff0c;平台的蛮荒期&#xff0c;成长期当中&#xff0c;铺货的商家是非常受欢迎的&#xff0c;因为平台需要更多SKU产品&#xff0c;去吸引买家&#xff0c;铺货这个时候是最好的也是能最快的成长起…

ife 零基础学院 day 2

第二天&#xff1a;给自己做一个在线简历吧 最后的验证&#xff0c;提出了几个问题&#xff0c;尝试解答一下 HTML是什么&#xff0c;HTML5是什么 HTML的定义摘抄自w3school的HTML 简介 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Langua…

excel数据生成sql insert语句

excel数据生成sql insert语句 excel表格中有A、B、C三列数据&#xff0c;希望导入到数据库users表中&#xff0c;对应的字段分别是name,sex,age 。 在你的excel表格中增加一列&#xff0c;利用excel的公式自动生成sql语句&#xff0c;方法如下&#xff1a; 1、增加一列&#xf…