SPARQL的查询是基于结构化知识的,变无序数据为有序知识,让计算机理解Web信息,即语义Web。现如今,语义网适用于各个领域,包括语义出版、语义知识库等。SPARQL是针对以RDF框架进行存储的知识库进行检索的SQL语句,因此有一定SQL基础的话,学习会很容易。
1.概述
2.匹配模式
3.组织结果集
4.查询方式
5.使用方式
什么是语义网?
语义网是一种使用可以被计算机理解的方式描述事物的网络。
- 林俊杰是著名歌手。
- 小酒窝是林俊杰唱的。
- 林俊杰也是演员。
像这样的句子可以被人类理解。但是如何能够被计算机理解呢?
陈述是由语法规则构建的。一门语言的语法定义了构建该语言的陈述所需的规则。
这就是语义网的本质所在 - 以计算机应用程序可以理解的方式描述事物。
语义网和网页之间的链接没有关系。
语义网描述的是事物之间的关系(比方说 A 是 B 的一部分,而 Y 是 Z 的成员)以及事物的属性(例如尺寸、重量、使用期限和价格等等)。
资源描述框架
RDF(资源描述框架,Resource Description Framework)是一种用于描述网络上的信息和资源的的标记语言。
将信息至于 RDF 文件之中,这样的话,这些信息就有可能被计算机程序("web spiders")从网络中搜索、发现、摄取、筛选、分析和处理。
语义网使用 RDF 来描述网络资源。
如果希望学习更多关于 RDF 的知识,请参考 http://www.w3school.com.cn/rdf/index.asp 。
1.概述:
当信息被表示为RDF后,出于推理和应用开发的需要,我们需要能够存取其中的部分。也就是需要叫做SPARQL的语言,它能够让我们通过选择、抽取等方式很容易地从被表示为RDF的知识中获得特定的部分。SPARQL是专为RDF设计的,适合并依赖于万维网上的各种技术。
SPARQL基础设施:
想要执行一条SPARQL查询,就需要一个能执行查询的软件。能做到这一点的最常用的软件叫做三元组存储库。本质上,一个三元组存储库就是一个RDF的数据库。在网上可以下载到很多三元组存储库。在SPARQL的相关规范中,三元组存储库也称为图存储库。 在查询一个三元组存储库之前,需要先向其中填充RDF数据。大部分三元组存储库都提供批量上传的选项。也有一种称为SPARQL更新的机制,提供了一系列向三元组存储库中插入、加载及删除RDF的选项。
2.匹配模式:
2.1简单的查询
Data: <http://example.org/book/book1>
<http://purl.org/dc/elements/1.1/title>
"SPARQL Tutorial" .
Query: SELECT ?title WHERE { <http://example.org/book/book1>
<http://purl.org/dc/elements/1.1/title> ?title . }
Result:
Title |
SPARQL Tutorial
|
例如,要在这段数据中做一个查询。找到这本书的书名。
在SPARQL中,我们可以将三元组中的任何一个元素替换为一个变量。变量的首字符是一个?(问号)。要引入一个变量表示所要查询的位置。
三元组存储库将接收这个图模式并尝试去找到能够匹配这个模式的那些三元组集合。因此找到了主谓一致的三元组。并返回它的宾语。
如这个例子中,Data中有一个三元组,在构建查询的时候,利用select关键词构造主语和谓语,宾语作为变量返回,系统会根据查询式构造一个三元组图模式与RDF库中的所有三元组进行匹配,将满足条件的结果返回。
2.2多个匹配
Data: @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:a foaf:name "Johnny Lee Outlaw" . _:a foaf:mbox <mailto:jlow@example.com> . _:b foaf:name "Peter Goodguy" . _:b foaf:mbox <mailto:peter@example.org> . _:c foaf:mbox <mailto:carol@example.org>.
Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?mbox WHERE { ?x foaf:name ?name . ?x foaf:mbox ?mbox }
Result:
与turtle类似,PREFIX关键词指明各种各种URL的缩写。返回的结果中,每一格表示一个结果。
Data中的_:a _:b _:c是空白节点,没有具体意义,且字母不固定,只是用来区分不同的实体资源。
2.3条件限制
如果上述的简单查询不能满足查询需求,则需要对查询的结果进行一定的条件限制,常用的限制字段主要为:filter、optinal、union。
Filter:限制数字或字符串符合一定要求的结果。数值型数据类型(即整数型、小数)和日期/时间都支持小于、大于和等于运算。
Optional关键词告诉三元组存储库为特定的图模式返回结果——如果能找到。即对于待返回的查询而言,这个图模式未必要满足。
UNION关键词告诉三元组存储库返回那些仅匹配一个图模式或两个都匹配的结果。
通过例子来进行学习:
Data: @prefix dc:<http://purl.org/dc/elements/1.1/> . @prefix : <http://example.org/book/> . @prefix ns: <http://example.org/ns#> . :book1 dc:title "SPARQL Tutorial" . :book1 ns:price 42 . :book2 dc:title "The Semantic Web" . :book2 ns:price 23 . Query: PREFIX dc: <http://purl.org/dc/elements/1.1/> PREFIX ns: <http://example.org/ns#> SELECT ?title ?price WHERE { ?x ns:price ?price . FILTER (?price < 30) ?x dc:title ?title . }
可以看到,filter字段通过对price的限制,筛选出了price小于30的所有实体,并返回title和price。
Data: @prefix dc: <http://purl.org/dc/elements/1.1/> . @prefix : <http://example.org/book/> . @prefix ns: <http://example.org/ns#> . :book1 dc:title "SPARQL Tutorial" . :book1 ns:price 42 . :book2 dc:title "The Semantic Web" . :book2 ns:price 23 . Query1: PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?title WHERE { ?x dc:title ?title FILTER regex(?title, "^SPARQL") }
Query2: PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?title WHERE { ?x dc:title ?title FILTER regex(?title, "web", "i" ) }
filter字段不仅可以对数字进行限制,还可以利用正则表达式进行对字符串的限制,filter加上regex,括号中表明变量?title,字符串str,即过滤出变量包含str的实体,str前面加^即表示以str开头,否则默认为包含有。
Data: @prefix foaf: <http://xmlns.com/foaf/0.1/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . _:a rdf:type foaf:Person . _:a foaf:name "Alice" . _:a foaf:mbox <mailto:alice@example.com> . _:a foaf:mbox <mailto:alice@work.example> . _:b rdf:type foaf:Person . _:b foaf:name "Bob" . Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?mbox WHERE { ?x foaf:name ?name . OPTIONAL { ?x foaf:mbox ?mbox } }
Data:
@prefix dc10: <http://purl.org/dc/elements/1.0/> .
@prefix dc11: <http://purl.org/dc/elements/1.1/> .
_:a dc10:title "SPARQL Query Language Tutorial" .
_:a dc10:creator "Alice" .
_:b dc11:title "SPARQL Protocol Tutorial" .
_:b dc11:creator "Bob" .
_:c dc10:title "SPARQL" .
_:c dc11:title "SPARQL (updated)" .
Query:
PREFIX dc10: <http://purl.org/dc/elements/1.0/>
PREFIX dc11: <http://purl.org/dc/elements/1.1/>
SELECT ?title
WHERE { { ?book dc10:title ?title }
UNION { ?book dc11:title ?title }
}
OPTIONAL表示有则返回,没有则返回空。UNION表示满足任一即返回,相当于布尔逻辑中的OR。
3.组织结果集:
我们想要查询结果以一种特定的方式返回:分组的、计数的或排序的。SPARQL支持一些函数来帮助我们组织结果集。
Order: put the solutions in order
Distinct: ensure solutions in the sequence are unique
Reduced: permit elimination of some non-unique solutions
Offset: control where the solutions start from in the overall sequence of solutions
Limit: restrict the number of solutions
在更大的数据集上,我们可能不知道有多少条结果,或者我们的查询会不会返回整个数据集。因此,一个好的做法就是限制一条查询能返回的答案的数量。就是LIMIT关键词。
Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?x foaf:name ?name } LIMIT 20 //限制返回结果为20条
如果不使用DISTINCT/REDUCED关键词,结果集中会出现重复的结果。
Data: @prefix foaf: <http://xmlns.com/foaf/0.1/> . _:x foaf:name "Alice" . _:x foaf:mbox <mailto:alice@example.com> . _:y foaf:name "Alice" . _:y foaf:mbox <mailto:asmith@example.com> . _:z foaf:name "Alice" . _:z foaf:mbox <mailto:alice.smith@example.com> . Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?x foaf:name ?name }
Query: PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT DISTINCT ?name WHERE { ?x foaf:name ?name }
DISTINCT关键字,可以保证结果唯一,REDUCED会对重复的结果进行适当的减少,不同的情况用不同的限制。
在SPARQL中,使用ORDER BY关键词来对返回的结果集排序。例如,按公寓所含卧室数量进行排序。
DESC关键词指明了按降序排列。ASC指的是升序。
此外,字符串得排序是根据字典序。
OFFSET和LIMIT关键词一起使用来选取不同的结果子集。 (前提是排序) PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?x foaf:name ?name } ORDER BY ?name LIMIT 1 OFFSET 5 //表示对排序后的结果剔除前五个,返回一个,即第六个。
4.查询方式:
SPARQL有四种查询形式。
SELECT:在查询匹配模式中,返回所有的,或者部分子集。
CONSTRUCT:通过取代三元组中的变量,返回一个新RDF图模式。
ASK:返回一个布尔值,显示是否有匹配项。
DESCRIBE:返回一个表述资源的RDF图模式。
5.使用方式:
sparql的使用方式主要为两种,一种是网页知识库提供的查询端口,例如wikidata中提供的query service,在不同的知识库中有不同的词表属性,对不同的实体和属性有不同的ID号,需要另外学习,但是基本的语法基本一样,看几个例子便可以使用;第二种是利用Jena包编写代码进行自定义查询,当然还有很多工具平台也提供了sparql端口,例如D2RQ,但是它的底层实现也是基于Jena实现对于RDF的解析和可视化。
在一月份,我会把使用D2RQ和Jena解析的详细步骤进行记录和介绍。