Neo4j 事務 深度遍歷

2021-08-13 08:57:38 字數 3965 閱讀 6101

事務

建立事務:

想顯式地回滾乙個事務,例如從乙個條件**塊,可以呼叫failure方法,則事務將在程式塊的結束做無條件的回滾。既不呼叫success方法也不呼叫failure方法也將會導致事務回滾(預設)。

在乙個事務中定義user標籤的name作為模式可索引的屬性,然後使用分離的事務實際設定乙個真實使用者的值:

許多資料庫管理系統使用鎖機制來管理對同乙個資料庫的同時訪問。neo4j 事務是由清晰的讀鎖和寫鎖來控制每乙個圖形資料庫資源(節點和關係)。

多個讀鎖之間並不相互排斥,在同一時間的多執行緒中,可以在同一資料資源中獲得多個讀鎖。在給定的時刻,對同一資料資源只能獲得乙個寫鎖,還必須沒有其他啟用的鎖,不管是讀鎖還是寫鎖。

neo4j事務的預設設定並不自動獲取讀鎖。因此,讀的資料是節點、關係、索引實體最新提交的狀態,除非在它自己的事務中,局域的修改(即使沒提交)是可見的。

寫鎖則是在對任意圖形資源試圖做變更操作時自動獲得,在事務的持續時 間內都有效。每乙個事務確保在完成時自動釋放所有的鎖。

如果需要乙個更高階別的隔離以確保其他人不能修改正在讀的圖形資源, neo4j提供了乙個潛在的顯式獲取對圖形資源的讀鎖。程式7-5給出了相應 **,但是這一次在讀取任何的屬性之前有乙個額外的顯式請求獲取對節點的讀鎖。

當讀資料時,有兩個很好的理由避免使用系統的鎖。就像以前提及的,首先這將產生事務的狀態,並且很佔記憶體。第二,這裡主要的權衡是同時寫資料,因為執行緒希望更新任何有顯式讀鎖的節點或關係,在鎖被釋放或事務完成前是鎖定的。

如果事務a試圖按節點1和節點2的順序鎖定它們,而事務b試圖對相同的節點按相反的順序獲取鎖,那麼每乙個事務可能會鎖定乙個節點並且無限期地等待另乙個節點釋放,從而產生乙個無效鎖。

要有效處理無效鎖:第乙個堅持使用neo4j提供的核心api而不使用任何外部的鎖定機制。這將確保neo4j的無效鎖探測機制是有效的,確保你的應用程式不會完全鎖死,並且資料會保持一致性。在neo4j核心api中的所有操作(除非另有指定)都是執行緒安全的,因此,一般不需要外部的同步。另乙個是通過確保圖形資源能夠以同樣的順序進行訪問來避免無效鎖。

深度遍歷

① 遍歷的順序

每一次遍歷器訪問乙個節點,它都需要決定下一步沿著哪個關係訪問哪個節點,重複這個過程直至遍歷結束。通過在圖形中選擇乙個合適的路徑,遍歷可以很快結束並且使用很少記憶體。這是圖論中的兩個主要順序演算法,並且這兩個演算法用於大多數的neo4j遍歷中:深度優先(depth-first)演算法和廣度優先(breadth-first)演算法。

深度優先:

深度優先順序表明你應該首先跳到現在所在且以前沒有訪問過的節點的第一級子 節點。如果所有的下一代子節點都已經訪問過,就應該返回具有沒有訪問過的子節點的第乙個節點上。

使用neo4j遍歷api深度優先遍歷整個圖形:

深度優先是neo4j預設的分支順序策略。當建立遍歷描述時,如果不指定遍歷的順序,則預設為深度優先。

廣度優先:

作為廣度優先演算法的一部分,遍歷在訪問子節點之前將首先訪問當前節點的所有同級節點。同級在這裡是指從根節點開始與你正在訪問的具有相同距離的節點。

在廣度優先遍歷中,離根節點越近的節點訪問得越早,將遠離根節點的節點放在後面 訪問。

使用neo4j遍歷api的廣度優先遍歷:

深度優先與廣度優先的比較:

圖形越大,遍歷順序對遍歷性能的影響就越大。當結果節點靠近起始節點時,廣度優先排序一般會給出較好的效能。但是遠離起始節點時,廣度優先排序總是比較慢,而深度優先排序可能非常高效,取決於結果節點是在圖形的左邊還是右邊。

在最壞的情況下,是整個圖形都需要遍歷(當結果節點在圖形的右下角時),深度優先和廣度優先都需要訪問所有的節點。由於廣度優先遍歷需要更大的記憶體記憶遍歷的足跡,這種情況下最好使用深度優先。

除速度之外,當決定遍歷的順序時,另乙個需要考慮的方面是遍歷的記憶體消耗。遍歷 時必須記住一些狀態,從哪個節點來,哪個節點已經訪問過。圖形越大,儲存這個狀態需要的記憶體就越多。

當使用深度優先時,你試圖用最快的速度深入到圖形。一旦你到了圖形的最底層(訪 問了乙個以前沒有訪問過的且沒有子節點的節點),你就可以完全忘掉圖形的這個分支——從遍歷的角度,可以認為已完成。

廣度優先遍歷在開始下一深度的節點之前,試圖在圖形中走得盡可能廣。因此,在遍歷期間,需要記住所有訪問過的節點和哪乙個子節點還沒有訪問。圖形越大越複雜,需要記住的節點就越多,會導致乙個巨大的記憶體占用。

一般來講,每乙個節點的關係越多,廣度優先需要的記憶體就越多。

如果結果靠近起始節點,廣度優先順序可能會更好。但是,如果圖形非常密(即每乙個節點有許多關係),則廣度優先順序在實際中可能會使用太多的記憶體。

② 路徑擴充套件器

擴充套件器是neo4j遍歷api的乙個部件,負責決定遍歷期間訪問過的任意節點應該跟蹤哪個關係。除選擇關係型別和訪向外,擴充套件器還負責跟蹤關係的順序。

③ 管理唯一性

node_global唯一性

neo4j遍歷中最典型的唯一性設定是node_global。它基本上意味著每乙個節點只能訪問一次並且在遍歷期間只能訪問一次。node_global是預設的遍歷設定,因此,如果你不指定唯一性,這樣的設定會在你的遍歷中使用。

node_path唯一性

node_path唯一性設定指定了從起始節點到當前節點,沒有路徑可以被遍歷兩次。多次訪問同乙個節點是允許的,但只有它們屬於不同的路徑才可以。

relationship_global唯一性

宣告圖形中的每乙個關係只能被訪問一次。如果圖形中節點之間具有多個關係,每乙個節點的訪問次數是連線該節點的關係數。

relationship_path唯一性

與node_path唯一性相似,其中的關係能被多次訪問,只要從起始節點到當前節點之間的關係組合是唯一的。這種唯一性設定也可以使節點被多次訪問。

當設定node_global唯一性或者relationship_global唯一性時,遍歷可能耗盡記憶體,尤其是在有很多連線的大型圖形資料庫中。由於唯一性的限制原因,每乙個節點(在node_global唯一性的情況下)或關係(在relationship_global唯一性的情況下)都必須記憶。這裡node_recent和relationship_recent設定開始起作用。當使用這些設定時,唯一性的限制稍微可以放寬。

對於node_recent,記憶訪問過的節點有乙個上限數。這個規則對 relationship_global也是一樣的,即乙個節點只能訪問一次,但是只是最近訪問的節點集合才被記憶用於比較。最近訪問需要記憶的節點能夠以第二個引數傳遞給唯一性方法

·node_level 確保處於同一級的節點(從起始節點開始具有相同距離的節點)在遍歷期間只被訪問一次。

·relationship_level 確保處於同一級的關係(從起始節點開始具有相同距離 的關係)在遍歷期間只被訪問一次。

④ 雙向遍歷

在乙個大型圖形上做乙個標準單向遍歷可能會有低於最佳的效能。在這種情況下通過使用雙向遍歷,有效地利用了兩個遍歷去遍歷圖形,把問題的尺度降低了一半。對於經典的單向遍歷,遍歷的關係數量隨著遍歷的深度成指數增長。當使用雙向遍歷時,每一側的遍歷將只需要訪問一半的圖形深度,做較少的節點— 關係—節點跳躍,從而獲得更好的效能。

Neo4j學習(2) Win系統安裝Neo4j

neo4j 是目前最流行的圖形資料庫,支援完整的事務,在屬性圖中,圖是由頂點 vertex 邊 edge 和屬性 property 組成的,頂點和邊都可以設定屬性,頂點也稱作節點,邊也稱作關係,每個節點和關係都可以由乙個或多個屬性。neo4j建立的圖是用頂點和邊構建乙個有向圖,其查詢語言cypher...

Neo4j檔案說明

neo4j作為資料庫式的nosql工具,檔案儲存也有其獨特方面。neostore neostore.id 儲存版本資訊 neostore.nodestore.db neostore.nodestore.db.id 儲存節點資料與節點序列id neostore.propertystore.db neo...

Neo4j學習筆記

neo4j學習筆記 一.基本知識 1.1 node syntax 節點語法 matrix movie matrix movie matrix movie matrix movie 1 代表乙個節點uncharacterized node 2 matrix 新增了乙個變數為matrix的節點。3 mo...