在介绍SPARQL的文章中,我提到过,现在正在开发好几种语言访问RDF数据。RDF是Web2.0环境下进行元数据定义和存储的主要标准。但是,大多数语言并不完善并且很复杂。人们需要简单的语言开展他们的工作。使用SquishQL访问RDF数据则非常简单,而且RDF查询语言具有sql特征。
Squish术语可认为是“sql-ish”,其查询语法也与sql结构很类似:在给定的约束条件下,在数据库找出给定变量的所有可能值。Squish中的约束表达式可以看成是RDF的声明语句的列表,这里每个声明的某些部分有缺省值(由“?”指示,它取代了URIs或者字符串)。
不仅仅只有RDF查询语言具有基于sql的语法,Jena RDF framework也是具有此语法的查询语言,它被称为RDQL,但是它渐渐向SPARQL演化。SquishQL 和 RDQL都以R.V.Guha的rdfDB查询语言为基础。
就SquishQL的前途来说,它似乎不能成为工业标准,因为在现代Java RDF构架内,支持具有更强大更复杂的语言,例如:SPARQL(请参看Jena, Joseki,或Sesame)。但是在RDF查询世界里,仍为初学者保留了SquishQL这种最简单的查询语言——像编程语言世界里的Pascal一样。
注意:本文中所有示例的文本都可以在此处下载。.
最初形象
这是典型的SquishQL查询示例(example1.txt)
Example 1
SELECT ?item, ?job, ?orghome, ?salary, ?currency
WHERE (job::advertises ?item ?job)
(rdf::type ?job wordnet::Job)
(job::salary ?job ?salary)
(job::currency ?job ?currency)
(job::orgHomepage ?job ?orghome)
USING job FOR http://ilrt.org/discovery/2000/11/rss-query/jobvocab.rdf#
rdf FOR http://www.w3.org/1999/02/22-rdf-syntax-ns#
wordnet FOR http://xmlns.com/wordnet/1.6/
此查询的结果可以被制成表结果集的样式显示出来,表中的列表示查询变量(“?salary”等),而行表示RSS中显示的事件的状态,在RSS中,变量与数据库中的值相匹配。另外,结果集可以作为另一个RDF数据库的视图,数据图中的节点和弧指示查询的结果。
对于结果集中的每一行来说,在给定的变量名处(例如“?item”,它由SELECT子句指定)都有具体的值。变量本身是个占位符,而不是特殊的Web资源。变量资源的某些属性是“代表”,它由WHERE子句的限制条件进行指定。
这是另一个简单查询。首先,我们列出sql-ish查询,接下来进行转换(example2.txt)。
Example 2
SELECT ?x, ?t, ?c, ?o
WHERE (dc::title ?x, ?t)
(dc::creator ?x, ?c)
(eg::homePage ?c http://purl.org/net/eric/)
(eg::worksFor ?c, ?o)
USING dc FOR http://purl.org/dc/1.1/
?eg FOR http://example.com/vocab/foaf/
下面是对这条语句的解释:
“找出主页‘http://purl.org/net/eric/’上所有资源(我们称之为‘x’)的dc标题(我们称之为‘t’),此资源有dc创建者‘c’,然后找出它们为谁工作。”
查询的结果是一个表(正如sql的结果),相应的列代表查询值“t”“x”“c”“o”。每一行提供数据库中与查询值匹配的数据,此数据受“WHERE”子句中限制条件的约束。