不多說,直接上干貨!
作為一款強健的,可伸縮的高性能數據庫,Neo4j最適合完整的企業部署或者用於一個輕量級項目中完整服務器的一個子集存在。
它包括如下幾個顯著特點:
- 完整的ACID支持
- 高可用性
- 輕易擴展到上億級別的節點和關系
- 通過遍歷工具高速檢索數據
1. 什么是圖數據庫?
圖數據庫用圖來存儲數據,是最接近高性能的一種用於存儲數據的數據結構方式之一。
1.1 一個圖由無數的節點和關系組成
最簡單的圖是單節點的,一個記錄,記錄了一些屬性。一個節點可以從單屬性開始,成長為成千上億,雖然會有一點點麻煩。從某種意義上講,將數據用關系連接起來分布到不同節點上才是有意義的。
1.2 用 Traversal 進行數據庫查詢
一次 Traversal, 你可以理解為是你通過一種算法,從一些開始節點開始查詢與其關聯的節點,比如你想找到 “我朋友喜歡但我不喜歡的那首音樂是什么呢?”,又或者 “如果斷電了,拿下服務器的服務會首影響?”等等問題。
1.3 Neo4j是一個圖數據庫
Neo4j是一個有商業支持的開源圖數據庫。他被設計來用於拿下數據不斷高速成長的數據存儲,用高效的圖數據結構代替傳統的表設計。用Neo4j工作,您的應用將得到圖的所有優越表現,以及您期望的高可靠性。
2. 圖數據庫模型
2.1 節點
構成一張圖的基本元素是節點和關系。在Neo4j中,節點和關系都可以包含屬性。
節點經常被用於表示一些_實體_,但依賴關系也一樣可以表示實體。
下面讓我們認識一個最簡單的節點,他只有一個屬性,屬性名是name,屬性值是Marko:
2.2 關系
# 節點之間的關系是圖數據庫很重要的一部分。通過關系可以找到很多關聯的數據,比如節點集合,關系集合以及他們的屬性集合。
- 一個關系連接兩個節點,必須有一個開始節點和結束節點。
- 因為關系總是直接相連的,所以對於一個節點來說,與他關聯的關系看起來有輸入/輸出兩個方向,這個特性對於我們遍歷圖非常有幫助:
-
關系在任一方向都會被遍歷訪問。這意味着我們並不需要在不同方向都新增關系。而關系總是會有一個方向,所以當這個方向對你的應用沒有意義時你可以忽略方向。特別注意一個節點可以有一個關系是指向自己的:
為了將來增強遍歷圖中所有的關系,我們需要為關系設置類型。注意 關鍵字 type 在這可能會被誤解,你其實可以把他簡單的理解為一個標簽而已。
舉例 :有兩種關系的最簡單的社會化網絡圖
2.3. 屬性
節點和關系都可以設置自己的屬性。
屬性是由Key-Value鍵值對組成,鍵名是字符串。屬性值要么是原始值,要么是原始值類型的一個數組。比如+String+,+int+和i+int[]+都是合法的
注意:
null不是一個合法的屬性值。Nulls能代替模仿一個不存在的Key。
2.4 路徑
路徑由至少一個節點,通過各種關系連接組成,經常是作為一個查詢或者遍歷的結果
- 最短的路徑是0長度的像下面這樣:
- 長度為1的路徑如下:
2.5. 遍歷(Traversal)
遍歷一張圖就是按照一定的規則,跟隨他們的關系,訪問關聯的的節點集合。最多的情況是只有一部分子圖被訪問到,因為你知道你對那一部分節點或者關系感興趣。
Neo4j提供了遍歷的API,可以讓你指定遍歷規則。最簡單的設置就是設置遍歷是寬度優先還是深度優先。
想對遍歷框架有一個深入的了解,tutorial-traversal。
想了解更多的Java代碼范例,tutorials-java-embedded-traversal。
其他查詢圖的方式還有cypher-query-lang, Cypher和gremlin-plugin, Gremlin。
參考
http://blog.csdn.net/u010801439/article/details/77202371