優化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.pswp.cn/news/370063.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370063.shtml
英文地址,請注明出處:http://en.pswp.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…