1. 程式人生 > >Neo4J圖庫的基礎介紹(一)

Neo4J圖庫的基礎介紹(一)

嵌入 模型 數據模型 特性 所有 並且 int 項目 語言

?Neo4j是一個高性能的,NOSQL圖形數據庫,它完全支持ACID(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability))數據庫事務屬性,采用JAVA語音編寫,由於其良好的圖數據模型設計,Neo4j的速度非常快。對於連接的數據操作,Neo4j的速度要比傳統的關系型數據庫快1000倍。部署一個neo4j服務器便可以承載上億級的節點和關系。當單節點無法承載我們的數據需求時,我們可以進行分布式集群部署. ?一個圖由無數的節點和關系組成 ?“一張圖 – 數據記錄在 → 節點 → 包括的 → 屬性裏面” ?最簡單的圖是單節點的,一個記錄,記錄了一些屬性。一個節點可以從單屬性開始,成長為成千上億,雖然會有一點點麻煩。從某種意義上講,將數據用關系連接起來分布到不同節點上才是有意義的。 技術分享
“節點 — 被組織 → 關系 — 可以有 → 屬性” 關系可以將節點組織成任意的結構,允許一張圖被組織成一個列表,一棵樹,一張地圖,或者一個復雜的實體 – 這個實體本身也是由復雜的,關系高度關聯的結構組成。 ?“一個索引 — 映射到 → 屬性 — 屬於 → 節點或者關系” ?經常,你想通過某一給定的屬性值找到節點或者關系。比起通過遍歷我們的圖來書,用索引將會更加高效。比如“找到用戶名是tony的用戶”。 節點 ?構成一張圖的基本元素是節點和關系。在Neo4j中,節點和關系都可以包含屬性。 ?節點經常被用於表示一些_實體_,但依賴關系也一樣可以表示實體。 技術分享 一個最簡單的節點,他只有一個屬性,屬性名是
name,屬性值是Marko 技術分享 關系 ?節點之間的關系是圖數據庫很重要的一部分。通過關系可以找到很多關聯的數據,比如節點集合,關系集合以及他們的屬性集合。 技術分享 一個關系連接兩個節點,必須有一個開始節點和結束節點。 技術分享 www.078886.cn
www.技術分享444814.cn ?因為關系總是直接相連的,所以對於一個節點來說,與他關聯的關系看起來有輸入/輸出兩個方向,這個特性對於我們遍歷圖非常有幫助: 技術分享 ?為了將來增強遍歷圖中所有的關系,我們需要為關系設置類型。註意 關鍵字 type 在這可能會被誤解,你其實可以把他簡單的理解為一個標簽而已。 ?下面的例子是一個有兩種關系的最簡單的社會化網絡圖。 技術分享
?節點和關系都可以設置自己的屬性。 ?屬性是由Key-Value鍵值對組成,鍵名是字符串。屬性值是要麽是原始值,要麽是原始值類型的一個數組。比如+String+,+int+和i+int[]+都是合法的。 技術分享 ?路徑:路徑由至少一個節點,通過各種關系連接組成,經常是作為一個查詢或者遍歷的結果。 技術分享 ?最短的路徑是0長度的像下面這樣: 技術分享 ?長度為1的路徑如下: 技術分享 社交關系圖 技術分享 技術分享 技術分享 技術分享 ?遍歷(Traversal):遍歷一張圖就是按照一定的規則,跟隨他們的關系,訪問關聯的的節點集合。最多的情況是只有一部分子圖被訪問到,因為你知道你對那一部分節點或者關系感興趣。 ?Neo4j提供了遍歷的API,可以讓你指定遍歷規則。最簡單的設置就是設置遍歷是寬度優先還是深度優先。 ?Traversal.preorderDepthFirst(): 深度優先,在訪問的子節點之前訪問每一個節點。 ?Traversal.postorderDepthFirst(): 深度優先,在訪問的子節點之後訪問每一個節點。 ?Traversal.preorderBreadthFirst(): 寬度優先,在訪問的子節點之前訪問每一個節點。 ?Traversal.postorderBreadthFirst(): 寬度優先,在訪問的子節點之後訪問每一個節點。 ?增加一個關系類型到遍歷的關系類型列表中。 默認情況下,這個列表是空的,意味著默認會返回 所有類型 的關系,而不考慮類型。 如果有關系被加入到這個列表中,那就意味著 只有 列表中的關系才會被遍歷。 有兩個方法,一個是包括方向,另外一個是排除方向,這個方法中遍歷關系是雙向的。 ? 通過引入一個正確的Java庫就可以將Neo4j放入項目中,在選擇了適合你的平臺的版本後,通過引入jar包到你的應用中來完成嵌入Neo4j,在嵌入式的模式下,Neo4j可以和應用程序運行於同一個進程,嵌入式的優點: 1、低延遲,直接與數據庫對話,沒有網絡開銷。 2、任選API,可以全範圍的訪問創建和查詢數據的API,包括Neo4j的核心API,遍歷框架和Cypher查詢語音 3、嵌入式模式提供了對命名索引的創建和管理的完全控制。 嵌入式缺點: 1、僅能應用於JVM,Neo4j是基於JVM的數據庫,因此它的很多API僅能通過基於JVM的語音訪問。 2、GC的行為,主機的應用程序垃圾回收器的行為會對Neo4j產生影響,並且當嵌入式實例運行於HA集群時,長期的GC暫停可能會使集群協議觸發主節點重選 3、應用程序負責控制數據庫的生命周期,包括啟動和關閉。嵌入式版本的Neo4j和服務器版本的Neo4j一樣,也可以做成集群。也可以將嵌入式和服務器版本的Neo4j做混合集群。 Neo4j可以作為一個獨立服務器訪問,可以直接通過一個REST接口或者一個基於指定語言的驅動。 1、REST API:服務器提供了REST API接口,允許客戶端通過http請求發送JSON格式的請求,響應包括JSON格式的消息響應。 2、平臺獨立性:由於訪問是通過HTTP發送的JSON格式的文檔,因此Neo4j服務器可以被運行於任何平臺的客戶端訪問。 3、Neo4J以服務器模式運行時,可以獨立於應用服務器。 4、與應用程序的GC行為隔離,服務器模式中,任何應用程序的不良GC行為都不會影響Neo4j。 5、網絡開銷:在接收到第一個客戶端請求之後,TCP鏈接會保持開啟狀態,知道客戶端關閉。 6、每個請求的事務:每個客戶端的請求都在一個單獨的事務上下文中被執行。 7、開發者可以自己擴展REST API,擴展采取JAX-RS註解類(annotated class)的形式。 技術分享

Neo4J圖庫的基礎介紹(一)