Triple-Store Graph Model 和 Data Model 總結

本文為 Design Data Intensive Applications 的書摘 + 個人心得。

Triple-Stores and SPARQL

最後要談的就是 Triple-store Graph Model,跟之前講的 Property Graph Model 差不多,只是用不同的方式來表達相同的想法,

在 Tripe-store 中,所有的資訊都存在這 3 個宣告裡,(subject, predicate, object) ,例如 (Bob, likes, banana),Bob 是 subject (主旨), likes 是 predicate (述部,這裡當動詞),banana 是 object (物件)。

subject 等於 graph 裡的 vertex,但 object 可能會有 2 種不同意思:

  • 當基礎資料型態用,等於 vetex 中的 properties,例如 (lucy, age, 33) 就是 lucy 這個 vetex 中有 {age: 33} 這個 property
  • 當另一個 Graph 的 vetex,這時 predicate 就是 Graph 的 edge,subject 是起點 vetex,object 是終點 vetex,例如 (lucy, marriedTo, alain) 就是 lucy 跟 alain 都是 vetex,然後有條 marriedTo 的 edge 從 lucy 向 alain 連過去。

再來就示範怎麼用 triple 格式建 Graph:

@prefix : <urn:example:>.
_:lucy            a                   :Person.
_:lucy            :name           "Lucy".
_:lucy            :bornIn     _:idaho.
_:idaho            a                   :Location.
_:idaho            :name           "Idaho".
_:idaho            :type           "state".
_:idaho            :within     _:usa.
_:usa                a                   :Location.
_:usa                :name           "United States".
_:usa                :type           "country".
_:usa                :within     _:namerica.
_:namerica    a                   :Location.
_:namerica    :name           "North America".
_:namerica    :type           "continent".

_: 開頭代表的是 vertex,還有要留意的是,當 object 是字串時,則 predicate 為 property,

當 object 是 vertex 時,則 predicate 為 edge,

我們也可以用另一種可讀性較高的簡潔寫法:

@prefix : <urn:example:>.
_:lucy            a   :Person;        :name   "Lucy";                     :bornIn _:idaho.
_:idaho            a   :Location;  :name   "Idaho";                    :type       "state";        :within     _:usa.
_:usa                a   :Location;  :name   "United States";    :type       "country";  :within     _:namerica.
_:namerica    a   :Location;  :name   "North America";    :type       "continent".

SPARQL

SPARQL 是一種用 RDF 模型給 triple-stores 使用的查詢語言,它比 Cypher 早出現,Cypher 的 pattern match 就是參考 SPAKQL 來的。

RDF 全名為 Resource Description Framework ,是 W3C 提出的一組標記式語言技術規範,其目的能透過此種規範把各網頁的 meta 資料統一化,但實務上沒什麼人在用。

我們一樣用之前提到的查詢案例 有哪些人是從 US 搬到 Europe? 來看 SPARQL 怎麼查詢的,

PREFIX : <urn:example:>
SELECT ?personName WHERE {
    ?person :name ?personName.
    ?person :bornIn / :within* / :name "United States". 
  ?person :livesIn / :within* / :name "Europe".
}

可以看到,它跟 Cypher 看起來有點像。

(person) -[:BORN_IN]-> () -[:WITHIN*0..]-> (location) # Cypher

?person :bornIn / :within* ?location. # SPARQL

總結

我們已經介紹了 3 個主要 Data Model, Relational, Document, Graph ,當 relational model 主宰軟體世界這麼長時間以來,NoSQL 概念的火紅替 Data Model 帶來了 2 個不同的方向:

  1. Document model 目標是用 self-contained document 的方式儲存資料,資料關係 (join relation) 薄弱。
  2. Graph Model 的目標是把一切都連起來。

每個 Data Model 都有其適合的場景,以我的公司 ETtoday 數據系統舉例,我們 3 個都有用到,當我們要解 Identify resolution 問題時就用 Graph model、做視覺化時用的資料 Relational model、數據後台用的資料是 Document model,有效率的混用依舊是未來的方向。

tshine73
tshine73
文章: 50

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *