一个SPARQL语句的说明

SPARQL,和“sparkle”的发音一样,它是一种 RDF 查询语言,可以从 RDF 图中查询信息。在 W3C Technical Reports and Publications 页面上,我们可以看到,现在和 SPARQL 相关的共有三项内容:其中两个是 Candidate Recommendations(候选推荐),SPARQL Protocol for RDF 和 SPARQL Query Results XML Format;另外一个是 Word Drafts(工作草案),SPARQL Query Language for RDF。上了这个页面,基本上就已经说明这个要成为 W3C 的推荐标准了,就像 RDF 和 OWL 一样。而且,在 WWW2006 发言时,TimBL 也已经表示,随着 SPARQL 查询语言即将完成标准化,语义网已经具备了成功所需要的所有标准和技术,Web开发人员和内容创作人员可以开始使用这些语义语言了。http://www.w3.org/2001/11/... 上有一个比较完整的列表。SPARQL 是基于以前的 RDF 查询语言(如rdfDB、RDQL 和 SeRQL)发展而来的,拥有一些有价值的新特性,并且受到 Jena 开发团队的鼎立支持。Jena 是 HP 公司语义网研究小组开发的一套 Java 工具包,用来支持人们进行语义网的相关研究和应用开发。SPARQL 的语法细节这里就不一一列举了,直接给出一个例子。总体来说,SPARQL 的语法和传统 SQL 的语法还是有几分相似的,大家应该不会陌生。

 

BASE <http://my.donews.com/>

 

PREFIX rdf: <">http://www.w3.org/1999/02/...

PREFIX foaf: <http://xmlns.com/foaf/0.1/...

# 这是一个以 BASE 为根的相对 IRI

PREFIX user: <users#>

SELECT ?person ?name ?age

FROM <users.rdf>

WHERE {

?person a foaf:Person ;

foaf:name ?name .

OPTIONAL { ?person user:age ?age } .

FILTER (REGEX(?name, “clickstone”))

}

ORDER BY ASC(?name)

LIMIT 10

OFFSET 10

 

简要的说明一下例子中出现的语法。

  1. BASE,根 IRI,其他以此为根的 IRI 就可以写成相对形式了,见例子里面的注释。一旦定义了 BASE,就可以在 SPARQL 的任何地方进行使用了,例子中共用到了 2 处。
  2. 使用 # 进行注释。
  3. PREFIX,IRI 前缀的缩写。
  4. SELECT,查询关键字,和 SQL 中的一个意思。
  5. ?person ?name ?age,要查询的变量,使用 ? 标识变量,也可以使用 $。变量间使用空白分隔(现在正在征集意见,正式标准中使用空白还是逗号分隔尚未最终确定)。
  6. FROM,从何处查询数据。可以一次查询多个 RDF 数据集,只需要使用 FROM 逐一列出即可。
  7. WHERE,过滤条件集合,和 SQL 的 WHERE 一个意思。
  8. ?person a foaf:Person,具体的过滤条件,使用 Turtle 语法。还记得“a”是什么意思吗?具体的介绍可以参看《RDF 实战》。
  9. 例子中两个过滤条件的主语都是“?person”,因此,使用了简写的形式。如果主语不同,逐一列出检索条件即可。
  10. OPTIONAL,可选过滤条件。比如有些 ?person 可能没有填写 age 属性,如果不使用 OPTIONAL,那么查询结果将不包含这些 ?person;使用了 OPTIONAL 关键字,没有填写 age 属性的 ?person,同样可以被查询到。
  11. FILTER (REGEX(?name, “clickstone”)),明确化的过滤条件,类似于 SQL 中的 LIKE、=、> 等的左右。例子中的意思是说,返回的 ?name 变量中,必须包含“clickstone”。
  12. ORDER BY,排序,可以指定多个排序,比如例子可以改为,ORDER BY ASC(?name) DESC(?age)。默认排序是 ASC。
  13. LIMIT 10,将返回结果限定在 10 条,类似于 SQL 中的 SELECT TOP 10。
  14. OFFSET 10,掠过前边的 10 条,从 第 11 条开始返回。这个功能比 SQL 强大,SQL 要自己写翻页。

 

其他的还有 UNION、DISTINCT 等的使用,大家就自己看文档吧。但必须强调一点,SPARQL 的使用中和 SQL 一个非常大的区别,需要大家注意:SELECT 子句中出现的变量,比如例子中的 ?person ?name ?age,在 WHERE 子句中必须全部出现。为什么会这样呢?因为对于一个 SPARQL 查询处理器来讲,它不具备类似于关系数据库中数据字典的东西以供参考,所以每一个 SELECT 的变量,在 WHERE 中必须指定一个用来匹配的triple。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章