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


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

下面一張圖說明,相比於其他NoSQL,圖數據庫存放的數據規模有所下降,但是更能夠表達復雜的數據。

通常來說,一個圖數據庫存儲的結構就如同數據結構中的圖,由頂點和邊組成。

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

Neo4j簡介

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

Neo4j因其嵌入式、高性能、輕量級等優勢,越來越受到關注。

圖形數據結構

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

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

  • 自帶一套易於學習的查詢語言(名為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.

上面的英文摘自<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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM