Neo4j學習筆記(一)初識Neo4j

前言

第一次聽到Neo4j,是在前天,我接到了一個task,自己造一個Neo4j的服務,並用docker搭建一個Neo4j的服務器。這兩天學習了一下Neo4j,本來不打算寫Neo4j的博客了,造完服務就算了,但是越是到後面,越是覺得自己對Neo4j中的一些概念理解的不夠透徹,從而直接影響了我的進度,我有了很多的疑惑。“理論支撐實踐”,果然是至理名言,就像當年讀書的時候,老師反反覆覆強調數據結構等一系列理論課很重要是一樣的道理。遂此刻,回頭整理知識點,還是那句話,溫故而知新,每一次的重新閱讀,都會有不一樣的收穫。

簡介

作爲一款強健的,可伸縮的高性能數據庫,Neo4j最適合完整的企業部署或者用於一個輕量級項目中完整服務器的一個子集存在。

它包括如下幾個顯著特點:

    1.完整的ACID支持
    2.高可用性
    3.輕易擴展到上億級別的節點和關係
    4.通過遍歷工具高速檢索數據

適當的ACID操作是保證數據一致性的基礎。Neo4j確保了在一個事務裏面的多個操作同時發生,保證數據一致性。不管是採用嵌入模式還是多服務器集羣部署,都支持這一特性。

可靠的圖型存儲可以非常輕鬆的集成到任何一個應用中。隨着我們開發的應用在運營中不斷髮展,性能問題肯定會逐步凸顯出來,而Neo4j不管應用如何變化,他只會受到計算機硬件性能的影響,不受業務本身的約束。部署一個neo4j服務器便可以承載上億級的節點和關係。當然,當單節點無法承載我們的數據需求時,我們可以進行分佈式集羣部署。將圖數據庫用於存儲關係複雜的數據是他最大的優勢。通過Neo4j提供的遍歷工具,可以非常高效的進行數據檢索,每秒可以達到上億級的檢索量。一個檢索操作類似於RDBMS裏面的連接(join)操作。

什麼是圖數據庫?

Neo4j是世界領先的開源圖形數據庫。 它完全由使用Java語言通過新技術的發展。

一個開源
Schema的自由
沒有SQL(Neo4j是使用CQL)
圖形數據庫 

圖形數據庫也被稱爲圖形數據庫管理系統或GDBMS。

官方網站:http://www.neo4j.org

從關係型數據庫(RDBMS)到圖數據庫(GDBMS)

圖數據庫是在圖形結構的形式存儲數據的數據庫。 它存儲在節點,關係和屬性方面我們的應用程序的數據。 就像在表的“行,列”的形式的RDBMS存儲數據,GDBMS在“圖”的形式存儲數據。

Relationships是圖數據庫中的很重要的部分(first-class citizens),不同於其他的數據庫管理系統,圖數據庫連接兩個實體(entities)是通過properties(屬性),你可以類比於關係型數據庫中的外鍵(foreign key)。通過組合簡單抽象的nodes(節點)和relationships(關係)形成了一種連接結構,GDBMS讓我們可以構建複雜的模型來映射我們所的問題域。

Neo4j的特點

SQL一樣容易查詢語言的Neo4j CQL

它遵循屬性圖數據模型

它通過使用Apache Lucence支持索引

它支持UNIQUE約束

它包含一個UI執行CQL指令:Neo4j的數據瀏覽器

它支持完整的ACID(原子性,一致性,隔離性和持久性)規則

它採用原生圖形庫與本地GPE(圖形處理引擎)

它支持查詢的數據導出到JSON和XLS格式

它提供了REST API由如Java,Spring等任何編程語言進行訪問

它提供了Java Script支持以任何UI MVC框架如Node JS進行訪問。

它支持兩種類型的Java API:Cypher支架API和本地Java API來開發Java應用程序。 

優勢

 這是很容易以表示連接數據。

這是很容易和更快的檢索更多的數據/遍歷/導航。

它表示半結構化數據變得非常容易。

Neo4j的CQL查詢語言命令在人性化的可讀格式,非常簡單易學。

它使用簡單,功能強大的數據模型。

它不需要複雜的連接來獲取連接/相關的數據,因爲它是非常方便地檢索它的相鄰節點或關係的細節沒有加入或索引。 

缺點

它具有支持節點,關係和屬性的數量的限制。

它不支持拆分。 

Neo4j數據模型

如下如所示

這是我們從neo4j的管理端看到現有數據的關係,一個簡單的圖(graph),由此圖引出Neo4j中很重要的三個概念:

Node: 圖一中的圓點就是節點,圖二中出現的MOVIEWS、USERS是節點的類型,用Label表示

Relationship: 圖一中有方向的直線就是關係,HAS_SEEN、IS_FRIEND_OF表示兩種不同關係

Property: Node和Relationship都會有屬性,比如USERS類型的Node有屬性name,用以表示人名(name:Kate Smith);關係HAS_SEEN有屬性star,用以表示對該電影的評分(star:5)

模型規則

三個要素:節點(node)、關係(relationship)、屬性(property)

這兩個節點和關係所包含的屬性

關係連接節點

屬性是鍵值對

節點用圓和關係使用箭頭鍵各自的代表。

關係是有方向的:單向和雙向。

每個關係包含“開始節點”或者“從節點”和“節點”或“端節點” 

節點(Node)

構成一張圖的基本元素是節點和關係。在Neo4j中,節點和關係都可以包含屬性。 節點經常被用於表示一些實體,但依賴關係也一樣可以表示實體。

關係(Relationship)

節點之間的關係是圖數據庫很重要的一部分。通過關係可以找到很多關聯的數據,比如節點集合,關係集合以及他們的屬性集合。

一個關係連接兩個節點,必須有一個開始節點和結束節點。

因爲關係總是直接相連的,所以對於一個節點來說,與他關聯的關係看起來有輸入/輸出兩個方向,這個特性對於我們遍歷圖非常有幫助:

關係在任一方向都會被遍歷訪問。這意味着我們並不需要在不同方向都新增關係。

而關係總是會有一個方向,所以當這個方向對你的應用沒有意義時你可以忽略方向。

特別注意一個節點可以有一個關係是指向自己的:

爲了將來增強遍歷圖中所有的關係,我們需要爲關係設置類型。注意 關鍵字 type 在這可能會被誤解,你其實可以把他簡單的理解爲一個標籤而已。

屬性(Property)

節點和關係都可以設置自己的屬性。 屬性是由Key-Value鍵值對組成,鍵名是字符串。屬性值是要麼是原始值,要麼是原始值類型的一個數組。比如String、int和int[]都是合法的。

注意
null不是一個合法的屬性值。 Nulls能代替模仿一個不存在的Key。

路徑(Path)

路徑由至少一個節點,通過各種關係連接組成,經常是作爲一個查詢或者遍歷的結果。

最短的路徑是0長度的像下面這樣:

長度爲1的路徑如下:

遍歷(Traversal)

遍歷一張圖就是按照一定的規則,跟隨他們的關係,訪問關聯的的節點集合。最多的情況是隻有一部分子圖被訪問到,因爲你知道你對那一部分節點或者關係感興趣。

Neo4j提供了遍歷的API,可以讓你指定遍歷規則。最簡單的設置就是設置遍歷是廣度優先還是深度優先。後面我會花很多篇幅詳細介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章