本文為 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 連過去。
![](https://it-iron.s3-ap-northeast-1.amazonaws.com/2020/figure_2-5-1.png)
再來就示範怎麼用 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 個不同的方向:
- Document model 目標是用 self-contained document 的方式儲存資料,資料關係 (join relation) 薄弱。
- Graph Model 的目標是把一切都連起來。
每個 Data Model 都有其適合的場景,以我的公司 ETtoday 數據系統舉例,我們 3 個都有用到,當我們要解 Identify resolution 問題時就用 Graph model、做視覺化時用的資料 Relational model、數據後台用的資料是 Document model,有效率的混用依舊是未來的方向。