圖形數據庫Neo4j基本瞭解

在深刻學習圖形數據庫以前,首先理解屬性圖的基本概念。一個屬性圖是由頂點(Vertex),邊(Edge),標籤(Lable),關係類型和屬性(Property)組成的有向圖。頂點也稱做節點(Node),邊也稱做關係(Relationship);在圖形中,節點和關係是最重要的實體,全部的節點是獨立存在的,爲節點設置標籤,那麼擁有相同標籤的節點屬於一個分組,一個集合;關係經過關係類型來分組,類型相同的關係屬於同一個集合。關係是有向的,關係的兩端是起始節點和結束節點,經過有向的箭頭來標識方向,節點之間的雙向關係經過兩個方向相反的關係來標識。節點可有零個,一個或多個標籤,可是關係必須設置關係類型,而且只能設置一個關係類型。Neo4j圖形數據庫的查詢語言是Cypher,用於操做屬性圖,是圖形語言中事實上的標準。html

 

 

一,圖形數據庫的基本概念node

Neo4j建立的圖(Graph)基於屬性圖模型,在該模型中,每一個實體都有ID(Identity)惟一標識,每一個節點由標籤(Lable)分組,每一個關係都有一個惟一的類型,屬性圖模型的基本概念有:數據庫

  • 實體(Entity)是指節點(Node)和關係(Relationship);
    • 每一個實體都有一個惟一的ID;
    • 每一個實體都有零個,一個或多個屬性,一個實體的屬性鍵是惟一的;
    • 每一個節點都有零個,一個或多個標籤,屬於一個或多個分組;
    • 每一個關係都只有一個類型,用於鏈接兩個節點;
  • 路徑(Path)是指由起始節點和終止節點之間的實體(節點和關係)構成的有序組合;
  • 標記(Token)是非空的字符串,用於標識標籤(Lable),關係類型(Relationship Type),或屬性鍵(Property Key);
    • 標籤:用於標記節點的分組,多個節點能夠有相同的標籤,一個節點能夠有多個Lable,Lable用於對節點進行分組;
    • 關係類型:用於標記關係的類型,多個關係能夠有相同的關係類型;
    • 屬性鍵:用於惟一標識一個屬性;
  • 屬性(Property)是一個鍵值對(Key/Value Pair),每一個節點或關係能夠有一個或多個屬性;屬性值能夠是標量類型,或這標量類型的列表(數組);

二,圖形示例數組

在下面的圖形中,存在三個節點和兩個關係共5個實體;Person和Movie是Lable,ACTED_ID和DIRECTED是關係類型,name,title,roles等是節點和關係的屬性。緩存

實體包括節點和關係,節點有標籤和屬性,關係是有向的,連接兩個節點,具備屬性和關係類型。性能優化

1,實體post

在示例圖形中,包含三個節點,分別是:性能

包含兩個關係,分別是:學習

  • 兩個關係類型:ACTED_IN和DIRECTED,
  • 兩個關係:鏈接name屬性爲Tom Hank節點和Movie節點的關係,鏈接name屬性爲Forrest Gump的節點和Movie節點的關係。

其中一個關係以下圖:優化

2,標籤(Lable)

在圖形結構中,標籤用於對節點進行分組,至關於節點的類型,擁有相同標籤的節點屬於同一個分組。一個節點能夠擁有零個,一個或多個標籤,所以,一個節點能夠屬於多個分組。對分組進行查詢,可以縮小查詢的節點範圍,提升查詢的性能。

在示例圖形中,有兩個標籤Person和Movie,兩個節點是Person,一個節點是Movie,標籤有點像節點的類型,可是,每一個節點能夠有多個標籤。

3,屬性(Property)

屬性是一個鍵值對(Key/Value),用於爲節點或關係提供信息。通常狀況下,每一個節點都由name屬性,用於命名節點。

在示例圖形中,Person節點有兩個屬性name和born,Movie節點有兩個屬性:title和released,

關係類型ACTED_IN有一個屬性:roles,該屬性值是一個數組,而關係類型爲DIRECTED的關係沒有屬性

三,遍歷(Traversal)

遍歷一個圖形,是指沿着關係及其方向,訪問圖形的節點。關係是有向的,鏈接兩個節點,從起始節點沿着關係,一步一步導航(navigate)到結束節點的過程叫作遍歷,遍歷通過的節點和關係的有序組合稱做路徑(Path)。

在示例圖形中,查找Tom Hanks參演的電影,遍歷的過程是:從Tom Hanks節點開始,沿着ACTED_IN關係,尋找標籤爲Movie的目標節點。

遍歷的路徑如圖:

 

四,圖形數據庫的模式

Neo4j的模式(Schema)一般是指索引,約束和統計,經過建立模式,Neo4j可以得到查詢性能的提高和建模的便利;Neo4j數據庫的模式可選的,也能夠是無模式的。

1,索引

圖形數據庫也能建立索引,用於提升圖形數據庫的查詢性能。和關係型數據庫同樣,索引是圖形數據的一個冗餘副本,經過額外的存儲空間和犧牲數據寫操做的性能,來提升數據搜索的性能,避免建立沒必要要的索引,這樣可以減小數據更新的性能損失。

Neo4j在圖形節點的一個或多個屬性上建立索引,在索引建立完成以後,當圖形數據更新時,Neo4j負責索引的自動更新,索引的數據是實時同步的;在查詢被索引的屬性時,Neo4j自動應用索引,以得到查詢性能的提高。

例如,使用Cypher建立索引:

CREATE INDEX ON :Person(firstname)
CREATE INDEX ON :Person(firstname, surname)

2,約束

在圖形數據庫中,可以建立四種類型的約束:

  • 節點屬性值惟一約束(Unique node property):若是節點具備指定的標籤和指定的屬性,那麼這些節點的屬性值是惟一的
  • 節點屬性存在約束(Node property existence):建立的節點必須存在標籤和指定的屬性
  • 關係屬性存在約束(Relationship property existence):建立的關係存在類型和指定的屬性
  • 節點鍵約束(Node Key):在指定的標籤中的節點中,指定的屬性必須存在,而且屬性值的組合是惟一的

例如,使用Cypher建立約束:

CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE;
CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn);
CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day);
CREATE CONSTRAINT ON (n:Person) ASSERT (n.firstname, n.surname) IS NODE KEY;

3,統計信息

當使用Cypher查詢圖形數據庫時,Cypher腳本被編譯成一個執行計劃,執行該執行計劃得到查詢結果。爲了生成一個性能優化的執行計劃,Neo4j須要收集統計信息以對查詢進行優化。當統計信息變化到必定的賦值時,Neo4j須要從新生成執行計劃,以保證Cypher查詢是性能優化的,Neo4j存儲的統計信息包括:

  • The number of nodes with a certain label.
  • Selectivity per index. 
  • The number of relationships by type.
  • The number of relationships by type, ending or starting from a node with a specific label.

默認狀況下,Neo4j自動更新統計信息,可是,統計信息的更新不是實時的,更新統計信息多是一個很是耗時的操做,所以,Neo4j在後臺運行,而且只有當變化的數據達到必定的閾值時,纔會更新統計信息。

Neo4j keeps the statistics up to date in two different ways. For label counts for example, the number is updated whenever you set or remove a label from a node. For indexes, Neo4j needs to scan the full index to produce the selectivity number. Since this is potentially a very time-consuming operation, these numbers are collected in the background when enough data on the index has been changed.

Neo4j把執行計劃被緩存起來,在統計信息變化以前,執行計劃不會被從新生成。經過配置選項,Neo4j可以控制執行計劃的從新生成:

  • dbms.index_sampling.background_enabled:是否在後臺統計索引信息,因爲Cypher查詢的執行計劃是根據統計信息生成的,及時更新索引的統計數據對生成性能優化的執行計劃很是重要;
  • dbms.index_sampling.update_percentage:在更新索引的統計信息以前,索引中有多大比例的數據被更新;
  • cypher.statistics_divergence_threshold:當統計信息變化時,Neo4j不會當即更新Cypher查詢的執行計劃;只有當統計信息變化到必定的程度時,Neo4j纔會從新生成執行計劃。

  

參考文檔:

Graph database concepts

Chapter 3. Cypher

原文地址:https://www.cnblogs.com/ljhdo/p/5178225.html
相關文章
相關標籤/搜索