本文内容预告
继上一篇文章对SPARQL基础语法的介绍后,本期我们将深入探讨SPARQL中的高级概念,包括Triple Pattern(三元组模式),Basic Graph Pattern(基本图模式),Graph Pattern(图模式),以及Aggregation Function(聚合函数)。我们将一步步展示如何利用这些高级特性,从RDF(资源描述框架)知识图谱中有效地检索和转换数据。
RDF 图模型 (参考第 4 期)
RDF图由三元组集合构成,每个三元组包含主语(URI或Blank Node),谓语(URI)和宾语(URI, Blank Node或Literal)。例如,以下朋友关系图的一个实例:
Triple Pattern (三元组模式)
给点无穷变量集合 V a r \mathbf{Var} Var,一个三元组模式定义为 ( s , p , o ) ∈ ( R ∪ B ∪ V a r ) × ( R ∪ V a r ) × ( R ∪ B ∪ L ∪ V a r ) (s,p,o)\in (\mathbf{R}\cup\mathbf{B}\cup\mathbf{Var})\times(\mathbf{R}\cup\mathbf{Var})\times(\mathbf{R}\cup\mathbf{B}\cup\mathbf{L}\cup\mathbf{Var}) (s,p,o)∈(R∪B∪Var)×(R∪Var)×(R∪B∪L∪Var) 。它跟三元组很像,唯一差别就是 s s s, p p p, o o o 还可以是变量。
三元组模式例子:
普通三元组:ex:jason ex:friend ex:saber_lion
,这种模式不包含变量,因此不执行查询。
带变量的三元组:例如 ?A ex:friend ?B
用于检索满足条件的 ?A
和 ?B
。
Basic Graph Pattern (基本图模式)
基本图模式可以用归纳法定义:
(1) 基本case: 如果 P
为一个三元组模式,那么 P
是一个基本图模式;
(2) 归纳case: 如果 P1
和 P2
是两个基本图模式,那么 P1 . P2
是一个基本模式。
白话就是说,基本图模式是多个三元组模式的联结 (conjunction,即逻辑 与
)
基本图模式例子:
ex:lily ex:friend ?P . ?P ex:friend ex:jason
查找既是 ex:lily
的朋友,又是 ex:jason
朋友的人。
ex:lily ex:friend ?A . ?B ex:friend ex:jason
这个图模式中两个三元组模式不共用同一个变量,结果是 ?A
的检索结果 {
ex:saber_lion
, ex:maria
} 和 ?B
的检索结果 {
ex:saber_lion
} 的笛卡尔积。
Graph Pattern (图模式)
图模式也用归纳法定义:
(1) 基本 case: 如果 P
是一个基本图模式,那么 P
是一个图模式;
(2) 归纳 case 1: 如果 P1
和 P2
是两个图模式,那么 {P1 . P2}
,{P1 UNION P2}
和 {P1 OPTIONAL P2}
是图模式。其中 .
表示 Jion
运算 (类似关系代数中的 Join
),UNION
表示 并
运算 (类似关系代数中的 UNION
),OPTIONAL
表示 P2
在图模式中可选 (类似关系代数中的 Left Outer Join
)。
(3) 归纳 case 2: 如果 P
是一个 图模式,R
是一个 SPARQL 条件(使用的变量要出现在 P
中),那么 P FILTER(R)
是一个图模式。
图模式例子:
?F ex:friend ?P OPTIONAL {?P ex:girlfriend ?GF}
查询所有有朋友的人,不论是否有女朋友。
?P ex:friend ?F FILTER(?P != <http://example.org/lily>)
用于查询所有不是 ex:lily
朋友的人,结果如下
Aggregation Function (聚合函数)
SPARQL 支持多种聚合函数 (1) 针对数值属性:SUM
, AVG
, MIN
, MAX
,(2)其他聚合函数:COUNT
, GROUP_CONCAT
。与 GROUP BY
一起使用。
聚合函数使用例子
统计每个人的朋友数量
SELECT ?P (COUNT(?F) AS ?Friend_Num) WHERE{
?P ex:friend ?F
} GROUP BY ?P
把每个人的朋友都聚合起来,用 seperate
关键字来指定用于分割符。
SELECT ?P (GROUP_CONCAT(?F; separator="; ") AS ?Friend_Num) WHERE{
?P ex:friend ?F
} GROUP BY ?P
扩展查询例子
拓展一个 FILETER NOT EXISTS
的语法,查询所有不是 ex:lily
朋友的人
SELECT * WHERE{
?P ex:friend ?F FILTER NOT EXISTS {<http://example.org/lily> ex:friend ?F}
}
后面的否定针对变量 ?F
。用谓词逻辑表示 ∃?P ∃?F (Friend(?P, ?F) ∧ ¬Friend(Lily, ?F))。
VALUES
语法使用,用于限定变量取值,查找 ex:jena
和 ex:saber_lion
的朋友
SELECT * WHERE{
VALUES ?P {<http://example.org/jena> <http://example.org/saber_lion>}
?P ex:friend ?F
}
之前的文章
知识图谱 (1)
本体论介绍 (2)
动手构建你的第一个知识图谱 by RDF (3)
图数据模型介绍 (4) 数学符号警告
SPARQL查询:如何高效检索Web数据 (5)
不定期更新专业知识和有趣的东西,欢迎反馈、点赞、加星
参考
- Scientific Data Management & Knowledge Graph, by Maria-Esther Vidal