neo4j:圖數(shù)據(jù)庫概念(二)

1. 基本概念

一個屬性圖由頂點(vertex)、邊(edge)、標(biāo)簽(label)、關(guān)系類型(relation type)和屬性(property)組成的有向圖。頂點也稱作節(jié)點(node),邊也稱作關(guān)系(relationship)。

在圖形中,節(jié)點和關(guān)系是最重要的實體,所有的節(jié)點是獨立存在的,為節(jié)點設(shè)置標(biāo)簽,那么擁有相同標(biāo)簽的節(jié)點屬于一個分組,也就是一個集合;關(guān)系通過關(guān)系類型來分組,類型相同的關(guān)系屬于同一個集合。

關(guān)系是有向的,關(guān)系的兩端是起始節(jié)點和結(jié)束節(jié)點,通過有向的箭頭來標(biāo)識方向,節(jié)點之間的雙向關(guān)系通過兩個方向相反的關(guān)系來標(biāo)識。

節(jié)點可以有0個、1個或多個標(biāo)簽,但是關(guān)系必須設(shè)置關(guān)系類型,并且只能設(shè)置一個關(guān)系類型。

neo4j創(chuàng)建的圖(Graph)基于屬性圖模型,在該模型中,每個實體都有ID唯一標(biāo)識,每個節(jié)點由標(biāo)簽分組,每個關(guān)系有一個唯一的類型。

屬性圖模型的基本概念有:

※ 實體:節(jié)點和關(guān)系

? ? - 每個實體有一個唯一的ID

? ? - 每個實體都有0個、一個或多個屬性,一個實體的屬性鍵是唯一的

? ? - 每個節(jié)點都有0個、1個或多個標(biāo)簽,屬于1個或多個分組

? ? - 每個關(guān)系都只有1個類型,用于連接兩個節(jié)點

※ 路徑:由起始節(jié)點和終止節(jié)點之間的實體(節(jié)點和關(guān)系)構(gòu)成的有序組合

※ 標(biāo)記:非空的字符串,用于標(biāo)識標(biāo)簽,關(guān)系類型或?qū)傩枣I

? ? - 標(biāo)簽:用于標(biāo)記節(jié)點的分組,多個節(jié)點可以有相同的標(biāo)簽,一個節(jié)點可以有多個標(biāo)簽,標(biāo)簽用于對節(jié)點進(jìn)行分組

? ? - 關(guān)系類型:用于標(biāo)記關(guān)系的類型,多個關(guān)系可以有相同的關(guān)系類型

? ? - 屬性鍵:用于唯一標(biāo)識一個屬性

※ 屬性:是一個鍵值對,每個節(jié)點或關(guān)系可以有一個或多個屬性;屬性值可以是標(biāo)量類型,或者標(biāo)量類型的列表(數(shù)組)

2. 圖形示例


? ? 上圖中存在3個節(jié)點和兩個關(guān)系共5個實體,其中,person和movie是標(biāo)簽,acted_in 和directed 是關(guān)系類型,name、title和roles是節(jié)點和關(guān)系的屬性鍵。

實體包括節(jié)點和關(guān)系,節(jié)點有標(biāo)簽和屬性,關(guān)系是有向的,用于鏈接兩個節(jié)點,具有屬性和關(guān)系類型。

1)實體

節(jié)點 + 關(guān)系

2)標(biāo)簽

在圖形結(jié)構(gòu)中,標(biāo)簽用于對節(jié)點進(jìn)行分組,相當(dāng)于節(jié)點的類型,擁有相同標(biāo)簽的節(jié)點屬于同一分組。一個節(jié)點可以有多個標(biāo)簽,因此,一個節(jié)點可以屬于多個分組。對分組進(jìn)行查詢,能夠縮小查詢的節(jié)點范圍,提高查詢性能。

3)屬性

屬性是一個鍵值對,用于為節(jié)點或關(guān)系提供信息。

上圖中,person節(jié)點有兩個屬性:name和born,movie節(jié)點有兩個屬性:title和released。

關(guān)系類型acted_in有一個屬性:roles,該屬性值是一個數(shù)組,而關(guān)系類型為directed的關(guān)系沒有屬性。

3. 遍歷

遍歷一個圖形,指的是沿著關(guān)系及其方向,訪問圖形的節(jié)點。關(guān)系是有向的,連接兩個節(jié)點,從起始節(jié)點沿著關(guān)系,一步一步導(dǎo)航到結(jié)束節(jié)點的過程叫做遍歷,遍歷經(jīng)過的節(jié)點和關(guān)系的有序組合稱作路徑path。

在示例圖形中,查找Tom Hanks參演的電影,遍歷的過程是:從Tom Hanks節(jié)點開始,沿著acted_in關(guān)系,尋找標(biāo)簽為movie 的目標(biāo)節(jié)點。

4. 圖形數(shù)據(jù)庫的模式

neo4j的模式通常是指索引、約束和統(tǒng)計,通過創(chuàng)建模式,neo4j能夠獲得查詢性能的提升和建模的遍歷;neo4j數(shù)據(jù)庫的模式是可選的,也可以是無模式的。

1) 索引

圖形數(shù)據(jù)庫也能創(chuàng)建索引,用于提高圖形數(shù)據(jù)庫的查詢性能。和關(guān)系型數(shù)據(jù)庫一樣,索引是圖形數(shù)據(jù)庫的一個冗余副本,通過額外的存儲空間和犧牲數(shù)據(jù)寫操作的性能,來提高數(shù)據(jù)搜索的性能,避免創(chuàng)建不必要的索引,這樣能夠減少數(shù)據(jù)更新的性能損失。

neo4j在節(jié)點的一個或多個屬性上創(chuàng)建索引,在索引創(chuàng)建完成之后,當(dāng)圖形數(shù)據(jù)更新時,neo4j負(fù)責(zé)索引的自動更新,索引的數(shù)據(jù)是實時同步的;在查詢被索引的屬性時,neo4j自動應(yīng)用索引,以獲得查詢性能的提升。

create index on : Person(firstname)

create index on :Person(firstname, surname)????????

2) 約束

圖形數(shù)據(jù)庫中,能夠創(chuàng)建4種類型的約束:

- 節(jié)點屬性值唯一約束(unique node property):如果節(jié)點具有指定的標(biāo)簽和指定的屬性,那么,這些節(jié)點的屬性值是唯一的

- 節(jié)點屬性存在約束(node property existence):創(chuàng)建的節(jié)點必須存在標(biāo)簽和指定的屬性

- 關(guān)系屬性存在約束(relationship property existence):創(chuàng)建的關(guān)系存在類型和指定的屬性

- 節(jié)點鍵約束(node key):在指定標(biāo)簽的節(jié)點中,指定的屬性必須存在,并且屬性值的組合是唯一的

create constraint on (book:Book) assert book.isbn is unique;

create constriant 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;


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容