在選擇資料庫的路上,我們遇到過哪些坑?(2)

2022-09-15 06:18:13 字數 3589 閱讀 8546

【編者按】你會怎麼選擇資料庫,是關聯式資料庫、xml 資料庫、資源描述框架(rdf),還是圖形資料庫?本文的第1部分深入而生動地**了各種選擇。在第2部分,將深入介紹使用 neo4j 的注意點。文章系國內 itom 管理平台 oneapm 編譯呈現。

下面介紹一些有關執行 neo4j 的實用技巧:

neo4j 是本地 j**a 平台,我們又是 j**a **,用 neo4j 相當合適。嵌入 neo4j 讓我們不用再進行 rest 呼叫,這對於安全來說確實很重要。有關進行 rest 呼叫的進一步危害,請**這段有關 rest 安全漏洞的 j**aone 討論。

嵌入式地執行 neo4j 還為我們大幅降低了複雜性。我們可以直接在程序中呼叫 neo4j api,從而快速了解 cypher 語言,以便執行 cypher 和 j**a api 這兩者的結合體。同時我們再也不需要託管和非託管的擴充套件了。

摸清自己的優勢和所選擇的工具的優勢,這一點極為重要。用工具來做不適當的事,效果會大打折扣。

本地圖形資料庫在關係方面的表現確實很好;在圖形中找到切入點,然後按照需要深入地研究各種關係,這在 neo4j 中快得驚人。但如果想要在單個節點之外進行複雜的多值屬性全文檢索,效果就大打折扣了 —— 但我們選擇圖形資料庫並不是為了做這個。

了解查詢時會發生哪些事情,這一點也極為重要,這能夠優化 cypher 語言。

請看下面這個非常簡單的查詢。我想要找到 franklin country 所有擁有狩獵執照的男性,並且執照上的位址需要和此人的家庭住址相匹配,以便我們確認這是同乙個人。

我有乙個人員節點,乙個執照節點,還有乙個位置節點,每個節點上都有各種不同屬性:

資料庫要做的第一件事就是找到切入點(可能有多個切入點),然後圖形從切入點展開搜尋。尋找切入點通常是個讓人頭痛的問題。為此要使用帶有靜態索引集的基於規則的規劃程式,這一軟體已於近期公升級為基於費用。這雖然還不夠完美,但無疑已經朝著正確的方向前進了一大步。

索引基本上會複製資料庫中的資訊片段,這樣有利於它迅速找到節點。在本例中,只使用資訊片段來確定切入點。雖然不是必須要使用索引,但它確實能派上用場。如果要在特定的節點屬性上進行檢索,在節點上設定乙個索引會是個好辦法,即使這會占用磁碟空間。

索引分為兩種:schema 和 legacy。schema 索引是最新版,使用內部自定義的 neo4j 內建索引,目前是預設設定。

一旦利用 cypher 或 j**a api 建立 schema 索引後,這些索引就會自動由資料庫維護。例如,如果你想在每個帶有「人員」標籤和「性別」屬性的節點上建立索引,當你建立新節點、更改節點值或刪除節點時,資料庫將自動對其進行更新。這時你也可以設定限定條件,比如必須存在屬性或屬性必須是唯一的。

legacy 索引是 lucene 索引,是較早的版本但尚未棄用。可以通過配置檔案、neo4j 屬性檔案、j**a api 或 cypher 來設定 legacy 索引。legacy 索引使用的是 lucene 而非 neo4j 專有索引機制。我們在用 neo4j 時幾乎沒有什麼漏洞,而每次遇到的漏洞基本都和 legacy 索引有關。即使是這樣,有時候這些索引也是必要的。

apache luke 是一款非常不錯的開源工具,使用者可以用它直接檢視和搜尋 lucene 索引。這也幫助我們修復了 legacy 索引中的異常行為。

legacy 索引有兩種用法:自動索引和手動索引。我建議使用自動索引,因為它更容易維護。基本上只要設定一次(可以在配置檔案中設定也可以通過 api 設定),然後設為在特定型別的節點上為特定型別的屬性編寫索引。自動索引還能夠在必要時輕鬆重建索引。

但是使用者無法指定是哪種型別的索引。在 lucene 中,schema 存在不同索引型別,例如字串、區分大小寫,以及數值,這些都是物理上獨立的索引。

如果你在查詢 lucene 時想要使用這些索引,必須要做的第一件事就是告訴 lucene 要使用哪個索引。但如果進行自動索引,neo4j 可以根據你要編寫索引的第乙個物件來選擇使用哪個索引。例如,如果你設定的第乙個索引是藍色,neo4j 就會明白藍色是字串,然後會永久性地將藍色放在字串索引中。

如果你能很好地控制收到的資料,這一索引方式效果會很不錯。但我們的系統沒有這樣。我們從許多不同的**接收資料,所以收到的「blue」(藍色)屬性可能會指年齡。但如果這一屬性是最先收到的,neo4j 就會把年齡作為基於字串的屬性而不是數值屬性來編寫索引,如此一來,之後就沒法按照我希望的方式展開進一步比對和排列了。在這種情況下,只能手動建立索引。

使用自動索引的另乙個好處是,如果目錄無故損壞,很容易就能修復目錄。可以暫停整個資料庫,進入 lucene 索引目錄,刪除此目錄,重啟資料庫,然後 neo4j 會為所有節點重新編寫索引。但如果已經進行了手動索引,你只能返回,然後為所有節點重新編寫索引。

下面一系列幻燈片顯示了範圍查詢:

我想查詢「profile」(個人資訊),所以我把profile放在查詢內容的前面。我想找到收入為特定數值(50500)的所有人群並且只返回最前面的兩個結果。

這段**表明,我已經有了某人的收入索引,規劃程式的限值是 2。nodeindexseek用這一索引來查詢數值,從乙個擁有 22 萬人的樣本資料庫中進行了大約 2800 次資料庫訪問。

在接下來的範圍查詢中,我準備查詢收入低於 50500 的人:

在這次的查詢中,我們執行了nodebylabelscan,由於沒有使用索引,我們進行了多達 43 萬次資料庫訪問。在 neo4j 第 2.3 版之前,schema 索引不支援範圍,所以你必須得用 legacy 索引,然後直接查詢 lucene 索引,才能發揮作用。

第 2.3 版修復了這一問題;現在有了nodeindexseekbyrange,可在 schema 標籤上提供範圍索引:

neo4j 使用增量日誌。如果你刪除了某個節點,最後系統會翻轉節點 id,這樣你就可以重複使用這些數字。我們結合使用了節點標籤和隨機選擇的 uuid,這樣如果你的 api 始終暴露在外,就可以提供額外的安全保障。

資料模型的重要程度至少和查詢相當。下面的說明很有用:可以通過多重關係型別或關係上的屬性來為部分關係建模。兩種方法似乎同樣合理,但它們的效能表現可能大相徑庭。一定要了解一下 graphaware 對這一內容的介紹。其區別在於,一方定義不同型別的personplace之間的關係……

……而另一方則表示有三種不同的屬性型別:

效能表現提公升了八倍。上述 graphaware 的文章深入詳細地解釋了這一概念。

explainprofile絕對是你的良師益友。別擔心 j**a api,而查詢規劃程式還很年輕,在許多情況下都比 cypher 要快。如果你要設定基準,一定要以溫備份資料庫設定基準。這樣就能載入 neo4j 的資料庫快取。

neo4j 擁有強大的支援社群,包括谷歌論壇、slack 協作頻道、stack overflow **和非常出色的支援團隊。

借助下面的樣板**,可以檢查資料庫中的每個節點並修復所有問題。這一示例有時會抓取關係,但你也可以對節點或其他限定條件進行同樣的操作。

不管怎樣,它都能事務性地依次通過資料庫中的所有節點。在本例中,每個事務是 90000 次操作,如果有需要,還可以批量更改整個資料庫:

本文** oneapm 官方部落格

在選擇資料庫的路上,我們遇到過哪些坑?(1)

編者按 你會怎麼選擇資料庫,是關聯式資料庫 xml 資料庫 資源描述框架 rdf 還是圖形資料庫?這篇演講深入而生動地 了各種選擇。本文系國內 itom 管理平台 oneapm 編譯呈現。備註 在去年十月於舊金山舉辦的 graphconnect 大會上,factgem 公司首席技術官 clark r...

在安裝資料庫中遇到的問題

最近在安裝sqlserver 2008r2的時候,遇到了這兩個問題 在第一次安裝的時候,顯示需要重啟計算機,按照以往的操作,重啟後一直提示重啟失敗,就可以進行安裝了,但是這一次確實陷入了無限重啟的怪圈,執行 regidit 找到hkey local machine system currentcon...

ORACLE 在設計資料庫時如何選擇正確的資料型別

在設計資料庫時,選擇正確的資料型別,往往可以避免很多的問題,正確理解資料庫的型別,對於儲存空間規劃,應用效能調整都會很有幫助,下文中將對這些資料型別進行詳細的講解。1 char 定長格式字串,在資料庫中儲存時不足位數填補空格,不建議使用,會帶來不必要的麻煩 a 字串比較的時候,如果不注意 char不...