Neo4j之坑

10個月前,我開始用neo4j做cmdb. 初體驗下去neo4j很美好. 但是一年中發(fā)現(xiàn)一些問題, 僅僅是個人的體驗.經(jīng)供參考

查詢語言

如果接觸過Neo4j,都會為Cypher的簡單和易用感覺到驚嘆, 向其他數(shù)據(jù)庫一樣,Neo4j也提供了ExplainProfile工具.這樣讓你容易理解查詢是如何運作的.如果你看過neo4j的查詢計劃優(yōu)化的圖,你會發(fā)現(xiàn)一大堆牽扯的線. 最開始簡單的查詢,一切都很美好.當(dāng)業(yè)務(wù)需求越來雜,你用到的查詢越來越復(fù)雜,你就發(fā)現(xiàn),天啊. 為什么我改了這么一小段代碼的順序,查詢慢了這么多. 所以官方也推薦你用多個小查詢替代一個大查詢. 所以你要遷移部分計算任務(wù)到你的代碼層,而不是通過Cypher再數(shù)據(jù)庫中幫你處理.

查詢的執(zhí)行過程

查詢監(jiān)視

你有沒有過這種情況, 本來你想查100條數(shù)據(jù),但是你寫錯了,你寫成查1M條數(shù)據(jù). 正常情況下,一般數(shù)據(jù)庫提供query watcher會阻止你這個查詢進行下去,因為這太耗內(nèi)存,會讓數(shù)據(jù)庫都崩了. Neo4j里面也有這個東西,但是好像作用不穩(wěn)定.最好的結(jié)果是你等待了很久得到了一個undefined--undefined. 更差的是數(shù)據(jù)庫崩了,再差一點,你的服務(wù)崩了.

讀優(yōu)先

Neo4j有一個設(shè)定,就是任何對Node的操作,都要先把該node的值讀出來. 在關(guān)系型數(shù)據(jù)庫中,你要刪除一個表,是不需要讀取每一列的數(shù)據(jù)的.而在neo4j里面,你要這樣做. 所以如果你想要根據(jù)label比如Match (n:label) delete n.那你就要小心了.如果你這個label下有1M的node.那這個任務(wù)是無法完成的,因為你的機器RAM不夠大.會讓JVM GC-FULL. 所以同樣,你必須在代碼層做一些分塊刪除處理. 又增加了你的編碼難度.

Neo4j的鎖行為和關(guān)系型數(shù)據(jù)庫不大一樣.關(guān)系型數(shù)據(jù)中你做了一個更新操作,那么根據(jù)你是樂觀/悲觀. 或者一些策略,數(shù)據(jù)庫的查詢執(zhí)行器會按照固定的套路進行查詢. 在Neo4j中.只有一個寫鎖.但這個寫鎖是在真的set語句開始執(zhí)行的時候才加上去的. 比如match (n:label {id:1}) set n.param=2.這句話中只有match執(zhí)行完了之后才會加上寫鎖. 這在并發(fā)更新的時候就會出現(xiàn)問題. 這在neo4j里面被討論的很多,很多人也提出了方案

連接

neo4j沒有連接池.而且也沒有參數(shù)限制數(shù)據(jù)庫連接數(shù).很多時候這個問題會導(dǎo)致很多不穩(wěn)定的情況發(fā)生.

擴展

因為用的是Neo4j3.3的版本.沒有全文檢索的功能.而需求又必須支持比較強大的查詢. 所以我需要一個搜索引擎. 我用了ES.但是我并不想在代碼層去做neo4j和ES的數(shù)據(jù)同步. 這樣又讓我的代碼復(fù)雜了. 所以我決定用neo4j的插件去做這件事情. neo4j沒有像數(shù)據(jù)庫trigger這樣的東西.但是可以用transacitonEventhanlder來實現(xiàn). 這就有一些問題.

  • 缺乏資料, 可能因為我是python程序員的緣故,我對java和kotlin一知半解.
  • 事件并不是真的像他說的那樣運轉(zhuǎn).比如beforeCommit.這個事件應(yīng)該發(fā)生在數(shù)據(jù)庫未發(fā)生變化的時候,這個時候你應(yīng)該是可以訪問被刪除的node.但是不是,你訪問不了.雖然該事務(wù)未提交. 幸好graphware提供了一系列的插件來支持這些事情.

總結(jié)

我沒有說Neo4j不能用于生產(chǎn)了,畢竟在它的官網(wǎng)那么多大公司都用了. 但是它至少還有待完善. 經(jīng)過使用了半年之后.我就決定將數(shù)據(jù)從neo4j遷出. 只在neo4j中保留全部數(shù)據(jù)集的子集.用來做一些必要的圖搜索算法.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晨继,一起剝皮案震驚了整個濱河市实蓬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杭抠,老刑警劉巖羞反,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件观游,死亡現(xiàn)場離奇詭異稽屏,居然都是意外死亡,警方通過查閱死者的電腦和手機抛虫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門滞磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莱褒,你說我怎么就攤上這事击困。” “怎么了广凸?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵阅茶,是天一觀的道長。 經(jīng)常有香客問我谅海,道長脸哀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任扭吁,我火速辦了婚禮撞蜂,結(jié)果婚禮上盲镶,老公的妹妹穿的比我還像新娘。我一直安慰自己蝌诡,他們只是感情好溉贿,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浦旱,像睡著了一般宇色。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颁湖,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天宣蠕,我揣著相機與錄音,去河邊找鬼甥捺。 笑死抢蚀,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镰禾。 我是一名探鬼主播思币,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羡微!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惶我,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤妈倔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绸贡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盯蝴,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年听怕,在試婚紗的時候發(fā)現(xiàn)自己被綠了捧挺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡尿瞭,死狀恐怖闽烙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情声搁,我是刑警寧澤黑竞,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站疏旨,受9級特大地震影響很魂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜檐涝,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一遏匆、第九天 我趴在偏房一處隱蔽的房頂上張望法挨。 院中可真熱鬧,春花似錦幅聘、人聲如沸凡纳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惫企。三九已至,卻和暖如春陵叽,著一層夾襖步出監(jiān)牢的瞬間狞尔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工巩掺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留偏序,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓胖替,卻偏偏與公主長得像研儒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子独令,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容