首页 理论教育 RDQL查询语言的分析介绍

RDQL查询语言的分析介绍

时间:2023-02-18 理论教育 版权反馈
【摘要】:RDQL已经被许多基于RDF的系统实现并用来从RDF图中查询数据,并且在Jena中得到了广泛应用。RDQL允许简明地表达复杂的查询,查询引擎执行访问数据模型的繁重工作。RDQL查询将RDF图完全看作数据,其语法遵循类似于SQL的SELECT模式,但省略了FROM子句。RDQL也继承了图的模式,采用三元组来表示。一个RDQL查询语句可以包含多个值的约束,并且返回多个变量的值,这和SQL相似。

RDQL查询语言的分析介绍

4.2.2 RDQL查询语言

RDQL是RDF的查询语言,最初是在Jenal.2.0中公布的。它不是正式的标准,但也在SPARQL产生之前得到了广泛的应用。RDQL是从早期的RDFDB QL和SquishQL演变过来的,只有微小的差别。RDQL已经被许多基于RDF的系统实现并用来从RDF图中查询数据,并且在Jena中得到了广泛应用。RDQL允许简明地表达复杂的查询,查询引擎执行访问数据模型的繁重工作。RDQL的语法表面上类似SQL的语法,它的一些概念对已经使用过关系数据库查询的人来说将比较熟悉,下面将给出几个简单的RDQL例子[12]

RDQL查询将RDF图完全看作数据,其语法遵循类似于SQL的SELECT模式,但省略了FROM子句。类似于SQL语句,查询开始处的SELECT子句能够投影变量。在一个查询中可以通过单独的USING从句来定义命名空间缩写。

一个RDF模型就是一个RDF图。通常也可以表现为一组三元组。RDQL也继承了图的模式,采用三元组来表示。每个三元组由变量名和RDF中的值(URI和Literal)组成。一个RDQL查询语句可以包含多个值的约束,并且返回多个变量的值,这和SQL相似。如下面的例子:

SELECT?x

WHERE(?x,<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>,

<http://example.com/someType>)

此RDQL查询匹配RDF模型中的谓语是http://www.w3.org/1999/02/22-rdf-syntax-ns#type,而宾语的值是http://example.com/someType的所有Statement(即三元组)。变量?x代表该三元组的<subject>。返回值是变量x,“?”表示x是一个变量。RDQL查询把RDF图当成数据来处理,如果模型的使用中产生了虚拟三元组(即在推理过程中产生的新三元组),RDQL也同样对这种虚拟三元组进行匹配。“<>”符号表示URI引用。不带“<>”的则表示Literal(可能是字符串String或者整型数等)。

上面的例子只包含一个三元组的条件,就像图中的单个边的匹配。如果需要更复杂的子图的匹配,就需要用到多个三元组的匹配。例如:

SELECT  ?family,?given

WHERE   (?vcard vcard:FN″John Smith″)

     (?vcard vcard:N?name)

     (?name vcard:Family?family)

     (?name vcard:Given?given)

USINGvcard FOR<http://www.w3.org/2001/vcard-rdf/3.0#>

这个RDQL查询基于vCard词汇表(vocabulary),用来获取正式名是“John Smith”的人的姓和名。“family”变量是姓,“given”变量是名。

SELECT子句是需要获取的变量,多个变量则用逗号隔开。FROM子句确定数据来源,即是哪个模型。FROM子句是可选的。如果在应用程序中使用RDQL,那么就需要设定参数来决定FROM的数据源。Where子句限定三元组匹配的条件。可以有多个条件,多个条件之间可以使用AND,OR等逻辑关系式来连接。下面的例子中WHERE子句中有两个条件,第二个条件是对age变量的值作了一个约束。

SELECT?resource

WHERE(?resource info:age?age)

AND?age>=24

USING info FOR<http://example.org/peopleInfo#>

如果加上FROM子句来限定数据源,就变成:

SELECT?resource

FROM<http://example.org/someWebPage>

WHERE(?resource info:age?age)

AND?age>=24

USINGinfo FOR<http://example.org/peopleInfo#>

USING…FOR…是用来简化URI的NameSpace的前缀。如上面例子中的“USINGinfo FOR http://example.org/peopleInfo#”表示用info代表“http://example.org/peopleInfo#”,那么info:age就表示“http://example.org/peopleInfo#age”。在Jena中,像“rdf”,“rdfs”,“owl”,“xsd”等常用的前缀都被内置了,在应用中可以直接使用rdf: datatype等,而不需要加上:

USING rdf FOR<http://www.w3.org/1999/02/22-rdf-syntax-ns#″>

rdfs FOR<http://www.w3.org/2000/01/rdf-schema#>

xsd FOR http://www.w3.org/2001/XMLSchema#

owl FOR<http://www.w3.org/2002/07/owl>

在Jena中有两种方式使用RDQL对RDF数据模型进行查询,第一种是命令行方式,另一种是使用Query类的实例。第一种方法将在后面Jena的命令行工具一节中进行详细介绍。下面我们介绍在Java程序中调用Jena的Query类来使用RDQL查询RDF模型。

其中,关键使用的类有:(www.xing528.com)

Query——查询类;

QueryExecution——执行查询;

QueryEngine——执行查询的算法实现;

QueryResults——查询结果集;

ResultBinding——变量与值的捆绑集合,用来取出变量的值。

首先将RDQL查询语句以一个String类型的参数传给Query类,然后设定Query类的数据源模型,接着使用QueryExecution来执行查询,如下面代码所示:

String querySting=″SELECT…″;

Query query=new Query(queryString);

//设置数据源

query.setSource(model);

QueryExecution qe=new QueryEngine(query);

QueryResults results=qe.exec();

for(Iterator iter=results;iter.hasNext();)

{

ResultBinding res=(ResultBinding)iter.next();

…process result here…

}

results.close();

查询的结果是一个Iterator类的对象,通过遍历得到一个变量和变量值的捆绑集合ResultBinding,然后使用get方法得到所查询变量的值。

for(Iterator iter=results;iter.hasNext();)

{

ResultBinding res=(ResultBinding)iter.next();

Object x=res.get(″x″);

Object fname=res.get(″fname″);

System.out.println(″x=″+x+″fname=″+fname);

}

下面是输出的结果:

x=http://somewhere/JohnSmith/fname=John Smith

x=http://somewhere/RebeccaSmith/fname=Becky Smith

x=http://somewhere/SarahJones/fname=Sarah Jones

x=http://somewhere/MattJones/fname=Matt Jones

RDQL主要的优点是简单,并能够很容易地跨平台执行。但RDQL被刻意设计成一个袖珍语言,因而缺乏复杂应用场景所需的强大的表达能力;同时,RDQL也缺乏形式化的语义。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈