本节书摘来自华章出版社《语义网基础教程(原书第3版)》一 书中的第3章,第3.2节,作者:(希)Grigoris Antoniou(荷)Paul Groth(荷)Frank van Harmelen(荷)Rinke Hoekstra ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.2 基础知识:匹配模式
回顾一下上一章中描述Baron Way公寓及其位置的RDF数据:
我们可能想要在这段数据上做一个查询。例如,找到这幢建筑的位置。怎样用SPARQL来表述呢?可以如下构建这个查询。我们想要匹配的是下面这个三元组:
在SPARQL中,我们可以将三元组中的任何一个元素替换为一个变量。变量的首字符是一个?(问号)。要引入一个变量表示位置,我们可以这样写:
三元组存储库将接收这个图模式(graph pattern)并尝试去找到能够匹配这个模式的那些三元组集合。因此,在之前的RDF数据上运行这个模式,一个三元组存储库将会返回dbpedia:Amsterdam和dbpedia:Netherlands。本质上,它找到了所有以swp:BaronWayBuilding作为主语、dbpedia-owl:location作为谓语的三元组。
要构建一个完整的SPARQL查询,还需要增加一些内容。首先,需要定义所有的前缀。还需要告诉三元组存储库我们对一个特定变量的结果感兴趣。因此,上述查询对应的完整SPARQL查询如下:
与Turtle类似,PREFIX关键词指明各种URL的缩写。SELECT关键词表明了哪些变量是感兴趣的。需要被匹配的图模式出现在WHERE关键词之后的括号中。返回的查询结果是一组称作绑定(binding)的映射,表示了哪些元素对应到一个给定的变量。表格中的每一行是一条结果或一个绑定。因此,这条查询的结果如下:
SPARQL的全部基础就是这个简单的概念:尝试去找到能够匹配一个给定图模式的那些三元组集合。SPARQL提供了更多的功能,用来指定更加复杂的模式并以不同的方式提供结果;但是无论模式多么复杂,运用的过程都是一样的。再举一个例子,查找到BaronWayApartment的位置。对应的SPARQL查询是:
我们已经扩展了图模式。在这个查询中有一些注意点:首先,变量也作为主语出现。在SPARQL查询中,变量可以出现在任何位置。其次,查询重用了变量名?building。这样,三元组存储库就知道它应该找那些第一条的宾语与第二条的主语相同的三元组。我们请读者来确定这条查询的答案。
我们并不局限于只匹配一个变量。我们可能想要找到三元组存储库中关于Baron Way Apartment的所有信息。可以使用这条SPARQL查询:
同样,表格中的每一行是一条单独的能匹配图模式的结果。对于我们这个很小的数据集,所有可能的答案可以很容易地返回。然而,在更大的数据集上,我们可能不知道有多少条结果,或者我们的查询会不会返回整个数据集。事实上,写一些能返回几百万个三元组的查询还是很容易的。因此,一个好的做法是限制一条查询能返回的答案的数量,特别是在使用公共端点时。这很容易通过使用如图3-1所示的LIMIT关键词来实现。在这个图中,我们将返回的结果条数限制为10。
我们已经学会了如何去匹配单个模式或者由多个三元组模式构成的链。SPARQL提供了一种精确表述属性链的方式。这一机制称为属性路径(property path)。例如下面这个例子。找到所有作为一幢位于Amsterdam的建筑的一部分的那些公寓。
有许多其他属性路径可以用来帮助在查询中表述很长的、各式各样的路径。在本章中,强调了更多这样的构造子。事实上,当读者写更复杂的SPARQL查询时,这些属性路径的快捷表示可能会变得更有用。
我们仅仅通过匹配图模式就可以完成很多事情。然而,有时候我们想要对查询结果施加更复杂的约束。在下一节中,我们讨论如何使用过滤器来表述这些约束。