RDF 定義
-
R代表Resource,即資源,任何可以被唯一標(biāo)識的對象,都可以稱為資源。例如,網(wǎng)頁、地點(diǎn)、人、事件、餐館等; -
D代表Description,也就是說對資源的描述,包括資源屬性的描述和資源間關(guān)系的描述; -
F則是指Framework,即RDF為資源描述提供了描述的語言和模型。
RDF 知識庫
RDF 字典(Schema)定義數(shù)據(jù)建模的元數(shù)據(jù)項(xiàng),包含 class 和 property 兩種類型。
class 表示對象實(shí)例,類似面向?qū)ο缶幊讨械?class ,property 分為 屬性(attribute) 和 關(guān)系(relationship) 兩類。
RDF 字典的定義自身也是一個 RDF graph, 即 RDF 是自描述的數(shù)據(jù)模型,是一種 schema-free 的數(shù)據(jù)模型。
sparql 查詢語句類型
注 下面查詢命令使用 d2r-server 啟動之后,以某個表結(jié)構(gòu)即可進(jìn)行測試
| 語句類型 | 描述 |
|---|---|
| SELECT | 從 RDF 中選擇出滿足條件的資源或者屬性; |
| CONSTRUCT | 根據(jù)條件獲取滿足條件的 Triple 并以此生成一個新的 RDF 數(shù)據(jù)集; |
| DESCRIBE | 獲取用戶輸入的資源的所有屬性描述; |
| ASK | SELECT 的優(yōu)化版本,它只檢查是否存在滿足條件的資源或者屬性,但不需要全部找出。 |
SELECT 查詢語句
如下以電影庫為例進(jìn)行舉例說明
1. 基礎(chǔ)語法
# 基礎(chǔ)查詢語句格式如下所示:
#
# PREFIX <前綴定義>
# SELECT [結(jié)果字段, ....]
# WHERE { 條件語句 }
# ORDER BY [排序字段] DESC/ASC
# LIMIT 數(shù)量
#
SELECT *
# 填充查詢條件
WHERE {
?s ?p ?o
}
# 輸出前十條記錄
LIMIT 10
2. 多條件查詢
# 定義前綴
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
# 輸出 ?n 屬性值
SELECT ?n
# 填充查詢條件
WHERE {
# 查詢條件,以 `.` 來表示單個查詢條件,單subject 多個條件時可以用 `;` 進(jìn)行鏈接
# 如下表示查詢 rdf:type = :Person and :personName = '鞏俐' 的人
?s rdf:type :Person ; :personName '鞏俐'.
# 再將人與電影進(jìn)行關(guān)聯(lián),獲取到電影名稱和電影的評級
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
}
# 輸出前十條記錄
LIMIT 10
3. 字段過濾
# 定義前綴
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
# 輸出 ?n 屬性值
SELECT ?n
# 填充查詢條件
WHERE {
# 查詢條件,以 `.` 來表示單個查詢條件,單subject 多個條件時可以用 `;` 進(jìn)行鏈接
# 如下表示查詢 rdf:type = :Person and :personName = '鞏俐' 的人
?s rdf:type :Person ; :personName '鞏俐'.
# 再將人與電影進(jìn)行關(guān)聯(lián),獲取到電影名稱和電影的評級
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
# 過濾出評級大于等于 7 的電影
FILTER (?r >= 7)
}
# 輸出前十條記錄
LIMIT 10
注 在 WHERE 語句中僅 FILTER 后面語句中能使用函數(shù), 常見函數(shù)列表查看下面參考鏈接內(nèi)容
4. 聚合
# 定義前綴
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
# 輸出 ?n 并重命名為 ?NAME, 聚合函數(shù)為 count 并重命名為 ?NELEMENTS 屬性值
SELECT (?n AS ?NAME) (COUNT(?o) as ?NELEMENTS)
# 填充查詢條件
WHERE {
# 查詢條件,以 `.` 來表示單個查詢條件,單subject 多個條件時可以用 `;` 進(jìn)行鏈接
# 如下表示查詢 rdf:type = :Person and :personName = '鞏俐' 的人
?s rdf:type :Person ; :personName '鞏俐'.
# 再將人與電影進(jìn)行關(guān)聯(lián),獲取到電影名稱和電影的評級
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
# 過濾出評級大于等于 7 的電影
FILTER (?r >= 7)
}
GROUP BY ?n
# 輸出前十條記錄
LIMIT 10
5. 排序
注 在 sparql 語句中的正/倒序與 sql 中的是有區(qū)別的,如下所示:
# 定義前綴
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
# 輸出 ?n 并重命名為 ?NAME, 聚合函數(shù)為 count 并重命名為 ?NELEMENTS 屬性值
SELECT (?n AS ?NAME) (COUNT(?o) as ?NELEMENTS)
# 填充查詢條件
WHERE {
# 查詢條件,以 `.` 來表示單個查詢條件,單subject 多個條件時可以用 `;` 進(jìn)行鏈接
# 如下表示查詢 rdf:type = :Person and :personName = '鞏俐' 的人
?s rdf:type :Person ; :personName '鞏俐'.
# 再將人與電影進(jìn)行關(guān)聯(lián),獲取到電影名稱和電影的評級
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
# 過濾出評級大于等于 7 的電影
FILTER (?r >= 7)
}
GROUP BY ?n
# 按評級進(jìn)行倒序排序,排序方式以函數(shù)的方式存在
ORDER BY DESC(count(distinct ?r)) ASC(?n)
# 上句 order by 語句也可以寫成 ORDER BY DESC(?NELEMENTS) ASC(?n)
# 輸出前十條記錄
LIMIT 10
參考
ASK 語句
詢問是否真實(shí)的語句,存在即返回為 true
# 語句中直接輸入 WHERE 條件語句即可
ASK {
# 查詢條件,以 `.` 來表示單個查詢條件,單subject 多個條件時可以用 `;` 進(jìn)行鏈接
# 如下表示查詢 rdf:type = :Person and :personName = '鞏俐' 的人
?s rdf:type :Person ; :personName '鞏俐'.
# 再將人與電影進(jìn)行關(guān)聯(lián),獲取到電影名稱和電影的評級
?s :hasActedIn ?o.
?o :movieTitle ?n.
?o :movieRating ?r.
}
CONSTRUCT 查詢語句
按條件查詢并輸出查詢結(jié)果的所有結(jié)構(gòu)
# 注意這里需要使用 {} 來括起來哦
CONSTRUCT { ?s ?p ?o }
WHERE {
# 查詢條件,以 `.` 來表示單個查詢條件,單subject 多個條件時可以用 `;` 進(jìn)行鏈接
# 如下表示查詢 rdf:type = :Person and :personName = '鞏俐' 的人
?s rdf:type :Person ; :personName '鞏俐'.
# 再將人與電影進(jìn)行關(guān)聯(lián),獲取到電影名稱和電影的評級
?s ?p ?o
}
參考
DESCRIBE 查詢語句
按條件查詢并輸出查詢結(jié)果并輸出其相應(yīng)的所有屬性描述
DESCRIBE ?s
WHERE {
# 查詢條件,以 `.` 來表示單個查詢條件,單subject 多個條件時可以用 `;` 進(jìn)行鏈接
# 如下表示查詢 rdf:type = :Person and :personName = '鞏俐' 的人
?s rdf:type :Person ; :personName '鞏俐'.
# 再將人與電影進(jìn)行關(guān)聯(lián),獲取到電影名稱和電影的評級
?s ?p ?o
}