Neo4j圖數據庫簡介和底層原理

現實中不少數據都是用圖來表達的,好比社交網絡中人與人的關係、地圖數據、或是基因信息等等。RDBMS並不適合表達這類數據,並且因爲海量數據的存在,讓其顯得捉襟見肘。NoSQL數據庫的興起,很好地解決了海量數據的存放問題,圖數據庫也是NoSQL的一個分支,相比於NoSQL中的其餘分支,它很適合用來原生表達圖結構的數據。html

下面一張圖說明,相比於其餘NoSQL,圖數據庫存放的數據規模有所降低,可是更可以表達複雜的數據。node

一般來講,一個圖數據庫存儲的結構就如同數據結構中的圖,由頂點和邊組成。程序員

Neo4j是圖數據庫中一個主要表明,其開源,且用Java實現。通過幾年的發展,已經能夠用於生產環境。其有兩種運行方式,一種是服務的方式,對外提供REST接口;另一種是嵌入式模式,數據以文件的形式存放在本地,能夠直接對本地文件進行操做。sql

Neo4j簡介

Neo4j是一個高性能的,NOSQL圖形數據庫,它將結構化數據存儲在網絡上而不是表中。Neo4j也能夠被看做是一個高性能的圖引擎,該引擎具備成熟數據庫的全部特性。程序員工做在一個面向對象的、靈活的網絡結構下而不是嚴格、靜態的表中——可是他們能夠享受到具有徹底的事務特性、企業級的數據庫的全部好處。數據庫

Neo4j因其嵌入式、高性能、輕量級等優點,愈來愈受到關注。網絡

圖形數據結構

在一個圖中包含兩種基本的數據類型:Nodes(節點) 和 Relationships(關係)。Nodes 和 Relationships 包含key/value形式的屬性。Nodes經過Relationships所定義的關係相連起來,造成關係型網絡結構。數據結構

從這幾個方面來講,Neo4j是一個合適的選擇。Neo4j……nosql

  • 自帶一套易於學習的查詢語言(名爲Cypher
  • 不使用schema,所以能夠知足你的任何形式的需求
  • 與關係型數據庫相比,對於高度關聯的數據(圖形數據)的查詢快速要快上許多
  • 它的實體與關係結構很是天然地切合人類的直觀感覺
  • 支持兼容ACID的事務操做
  • 提供了一個高可用性模型,以支持大規模數據量的查詢,支持備份、數據局部性以及冗餘
  • 提供了一個可視化的查詢控制檯,你不會對它感到厭倦的

何時不該使用Neo4j?

做爲一個圖形NoSQL數據庫,Neo4j提供了大量的功能,但沒有什麼解決方案是完美的。在如下這些用例中,Neo4j就不是很是適合的選擇:分佈式

  • 記錄大量基於事件的數據(例如日誌條目或傳感器數據)
  • 對大規模分佈式數據進行處理,相似於Hadoop
  • 二進制數據存儲
  • 適合於保存在關係型數據庫中的結構化數據

neo4j存儲模型

The node records contain only a pointer to their first property and their first relationship (in what is oftentermed the _relationship chain). From here, we can follow the (doubly) linked-list of relationships until we find the one we’re interested in, the LIKES relationship from Node 1 to Node 2 in this case. Once we’ve found the relationship record of interest, we can simply read its properties if there are any via the same singly-linked list structure as node properties, or we can examine the node records that it relates via its start node and end node IDs. These IDs, multiplied by the node record size, of course give the immediate offset of both nodes in the node store file.oop

上面的英文摘自<Graph Databases>(做者:IanRobinson) 一書,描述了 neo4j 的存儲模型。Node和Relationship 的 Property 是用一個 Key-Value 的雙向列表來保存的; Node 的 Relatsionship 是用一個雙向列表來保存的,經過關係,能夠方便的找到關係的 from-to Node. Node 節點保存第1個屬性和第1個關係ID。

經過上述存儲模型,從一個Node-A開始,能夠方便的遍歷以該Node-A爲起點的圖。下面給個示例,來幫助理解上面的存儲模型,存儲文件的具體格式在第2章詳細描述。

示例1


在這個例子中,A~E表示Node 的編號,R1~R7 表示 Relationship 編號,P1~P10 表示Property 的編號。

  • Node 的存儲示例圖以下,每一個Node 保存了第1個Property 和 第1個Relationship
  • 關係的存儲示意圖以下:

    從示意圖能夠看出,從 Node-B 開始,能夠經過關係的 next 指針,遍歷Node-B 的全部關係,而後能夠到達與其有關係的第1層Nodes,在經過遍歷第1層Nodes的關係,能夠達到第2層Nodes,…

 參考:http://www.cnblogs.com/ljhero/archive/2012/05/13/2498039.html

http://www.cnblogs.com/ljhero/archive/2012/05/13/2498039.html

底層原理:http://sunxiang0918.cn/2015/06/27/neo4j-%E5%BA%95%E5%B1%82%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84%E5%88%86%E6%9E%90/

相關文章
相關標籤/搜索