深入探索 SPARQL,使用复杂图模式和聚合函数 (6)

发布时间 2023-11-16 06:40:19作者: JasonHao

本文内容预告

继上一篇文章对SPARQL基础语法的介绍后,本期我们将深入探讨SPARQL中的高级概念,包括Triple Pattern(三元组模式),Basic Graph Pattern(基本图模式),Graph Pattern(图模式),以及Aggregation Function(聚合函数)。我们将一步步展示如何利用这些高级特性,从RDF(资源描述框架)知识图谱中有效地检索和转换数据。

RDF 图模型 (参考第 4 期)

RDF图由三元组集合构成,每个三元组包含主语(URI或Blank Node),谓语(URI)和宾语(URI, Blank Node或Literal)。例如,以下朋友关系图的一个实例: image.png

Triple Pattern (三元组模式)

给点无穷变量集合 \mathbf{Var},一个三元组模式定义为 (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 还可以是变量。

三元组模式例子: 普通三元组:ex:jason ex:friend ex:saber_lion,这种模式不包含变量,因此不执行查询。

带变量的三元组:例如 ?A ex:friend ?B 用于检索满足条件的 ?A?Bimage.png

Basic Graph Pattern (基本图模式)

基本图模式可以用归纳法定义: (1) 基本case: 如果 P 为一个三元组模式,那么 P 是一个基本图模式; (2) 归纳case: 如果 P1P2 是两个基本图模式,那么 P1 . P2 是一个基本模式。 白话就是说,基本图模式是多个三元组模式的联结 (conjunction,即逻辑 )

基本图模式例子ex:lily ex:friend ?P . ?P ex:friend ex:jason 查找既是 ex:lily 的朋友,又是 ex:jason 朋友的人。 image.png

ex:lily ex:friend ?A . ?B ex:friend ex:jason 这个图模式中两个三元组模式不共用同一个变量,结果是 ?A 的检索结果 {ex:saber_lion, ex:maria} 和 ?B 的检索结果 {ex:saber_lion} 的笛卡尔积。 image.png

Graph Pattern (图模式)

图模式也用归纳法定义: (1) 基本 case: 如果 P 是一个基本图模式,那么 P 是一个图模式; (2) 归纳 case 1: 如果 P1P2 是两个图模式,那么 {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} 查询所有有朋友的人,不论是否有女朋友。 image.png

?P ex:friend ?F FILTER(?P != <http://example.org/lily>) 用于查询所有不是 ex:lily 朋友的人,结果如下 image.png

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
image.pngimage.png

把每个人的朋友都聚合起来,用 seperate 关键字来指定用于分割符。

SELECT ?P (GROUP_CONCAT(?F; separator="; ") AS ?Friend_Num) WHERE{
 ?P ex:friend ?F
} GROUP BY ?P
image.pngimage.png

扩展查询例子

拓展一个 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))。 image.png

VALUES 语法使用,用于限定变量取值,查找 ex:jenaex:saber_lion 的朋友

SELECT * WHERE{
	VALUES ?P {<http://example.org/jena> <http://example.org/saber_lion>}
	?P ex:friend ?F 
}
image.pngimage.png

之前的文章

知识图谱 (1)
本体论介绍 (2)
动手构建你的第一个知识图谱 by RDF (3)
图数据模型介绍 (4) 数学符号警告
SPARQL查询:如何高效检索Web数据 (5)

不定期更新专业知识和有趣的东西,欢迎反馈、点赞、加星

参考

  1. Scientific Data Management & Knowledge Graph, by Maria-Esther Vidal