SPARQL 查询的特点Word格式文档下载.docx
- 文档编号:16719205
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:12
- 大小:23.27KB
SPARQL 查询的特点Word格式文档下载.docx
《SPARQL 查询的特点Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《SPARQL 查询的特点Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
.
<
afoaf:
Person;
foaf:
name"
WingC.Yung"
;
mbox<
mailto:
wing@>
phone"
1-555-555-5555"
knows<
LeeFeigenbaum"
lee@>
1-555-555-5556"
第一行定义了数据前缀,这样DE>
就能简写为DE>
foaf:
nameDE>
。
可以指定多个前缀。
此外,Turtle用分号(DE>
;
DE>
)表示后续行中的谓词和宾语使用相同的主语。
谓词DE>
aDE>
是RDF类型谓词(DE>
http:
//www.w3.org/1999/02/22-rdf-syntax-ns#:
type>
)的缩写,可用于表示资源属于特定类型。
虽然RDF的格式很自由,但可用OWL(Web本体语言)通过定义概念的谓词词汇表和关于谓词的规则来限制数据的结构(关于OWL的更多信息请参阅参考资料)。
OWL本体的一个例子是FriendofaFriend(FOAF),用于表达联系人信息及相互关系的RDF数据(关于FOAF的更多信息请参阅参考资料)。
本体可以定义数据类(比如DE>
PersonDE>
),限制主语和宾语的类型(DE>
knowsDE>
的主语和宾语必须是DE>
类型,并对谓词的基数进行限制。
只要可能应尽量使用FOAF这类通用本体,公共的结构和词汇表有助于数据的集成。
使用SPARQL查询RDF
SPARQL是语义Web的标准查询语言。
其语法类似于SQL,SPARQL查询包括一系列的三元组范型和修饰符。
SPARQL被设计成能够查询Web上分布的多个数据源。
试验下面的查询可使用通用的SPARQL处理程序(请参阅参考资料)。
将DE>
粘贴到TargetgraphURI字段中。
输入查询并单击GetResults之后,就会检索Turtle文件并进行查询。
SPARQL有四种类型的查询:
SELECTDE>
:
返回满足查询的一组变量绑定(类似SQLDE>
)。
非常适合产生应用程序要消费的数据。
CONSTRUCTDE>
返回一个图(一组RDF命题)。
适合检索和转换RDF。
ASKDE>
返回一个布尔值,说明是否存在查询的结果。
DESCRIBEDE>
依赖于实现。
接收一个资源并返回描述该资源的图。
清单2示范了DE>
查询。
清单2.SPARQLSELECT例子
Query:
PREFIXfoaf:
SELECT?
person?
phone
WHERE{
?
personfoaf:
.
phone?
phone
}
Result:
----------------------------------------------------
|person|phone|
====================================================
|<
|"
|
非常重要,可以根据SPARQL查询结果构造RDF图。
在数据合并的时候很方便,因为CONSTRUCT图中的谓词不一定和原图中的相同。
清单中查询DE>
phoneDE>
,不过在它的位置使用不同的谓词构造了一个新的图(DE>
wingerz:
officephoneDE>
清单3.SPARQLCONSTRUCT的例子
PREFIXwingerz:
CONSTRUCT{
personwingerz:
officephone?
}WHERE{
?
xmlversion="
1.0"
>
rdf:
RDF
xmlns:
wingerz="
foaf="
rdf="
//www.w3.org/1999/02/22-rdf-syntax-ns#"
Descriptionrdf:
about="
officephone>
1-555-555-5555<
/wingerz:
name>
WingC.Yung<
/foaf:
/rdf:
Description>
RDF>
试验DE>
查询的时候,在资源页面上可以看到完整的响应。
遗憾的是,结果被序列化为RDF-XML格式,不是很优雅的一种RDF序列化格式。
以RDF格式存储数据的好处
初看起来,RDF数据似乎有点笨拙而且非常罗嗦。
但是有一些突出的优点。
RDF数据是自描述的。
RDF图包括数据和结构。
资源通常是可解析的。
如果看到清单1所示的RDF但不知道DE>
是如何定义的,可以在Web浏览器中访问DE>
数据的结构没有限制。
XML是层次化的,在关系数据库中建模(和查询)图结构非常困难。
SPARQL不需要设计数据访问接口。
搜索API(比如搜索雇员)往往不是功能非常有限就是过于复杂。
数据容易合并。
合并数据(不同的图)是一项简单操作,只需要建立包含图中所有三元组的集合。
全球唯一资源减少了歧义。
而且如果必要的话,可以用OWL规则将不同URI的资源映射到同一个URI。
虽然可以增加结果(使用RDFS和OWL),但结构不是强制性的。
向资源添加未指定的属性不会使数据无效。
也不会破坏和数据交互的已有代码。
SquirrelRDF入门
JenaSemanticWebFramework包括RDF存储和查询执行组件。
SquirrelRDF是将关系数据库和LDAP中的数据公开以便通过SPARQL查询的工具。
本文主要讨论SquirrelRDF的LDAP组件。
(关于这些项目的更多信息请参阅参考资料。
)
LDAP目录本身的结构很容易转化成RDF。
每个LDAP对象类都有一组属性。
其中一些属性指向文字值(比如名称),另一些则指向其他对象[比如专用名词(DN)指定的工作地点]。
下载SquirrelRDF源代码。
还需要Jena(下载推荐的版本)。
SquirrelRDF主页详细介绍了需要的各种信息(请参阅参考资料)。
安装后,第一步是寻找LDAP存储的模式。
如果没有可供试验的LDAP存储,可以安装OpenLDAP并按照使用说明创建一个简单的地址簿(请参阅参考资料,尽管可能没有必要费这么多事,因为本文的目标是利用已有的数据源)。
模式包含所有不同的对象类及其属性。
通过分析属性,可以确定目录中对象之间的关系。
该例中使用一个非常简单的LDAP模式。
其中DE>
类包含一些基本的性质(比如姓名和电话),同时指向另一个对象类DE>
OfficeLocationDE>
包括名称、两个街道地址字段、市和州。
还有一个manager属性,指向另一个DE>
现在来创建从LDAP模式到RDF的映射。
SquirrelRDF使用RDF文件表示这种映射。
lmap:
serverDE>
谓词用于指定LDAP存储的位置。
映射允许分配两种类型的RDF谓词:
文字宾语或者资源宾语。
姓名和电话这类基本属性映射为文字宾语谓词。
这类映射需要LDAP属性名和RDF谓词名。
然后即可将其链接到资源。
假设需要将LDAPDE>
cnDE>
映射到RDFDE>
清单4中创建了一个资源来进行链接(DE>
:
namemappingDE>
),然后将其链接到配置资源(DE>
清单4.SquirrelRDF文字映射
@prefixlmap:
lmap:
mapsProp:
namemapping.
namemappinglmap:
propertyfoaf:
name
attribute"
cn"
请注意,将这些链接到一起的URI无关紧要,可以改用空白节点,即没有URI的资源。
它与空白URI的资源不同,后面也包括这样的资源。
空白URI是一种相对URI,因而解析到Turtle文件所在的位置。
清单5中用空白节点替换了资源,使用方括号表明其中的两个命题片断都使用空白节点主语。
这些方括号出现在DE>
mapsPropDE>
谓词之后,表示空白节点是该命题的宾语。
清单5.SquirrelRDF文字映射到空白节点
mapsProp
[lmap:
]
要映射指向专有名词的LDAP属性,可将空白节点的类型指定为DE>
ObjectPropertyDE>
这样可以保证分配的谓词指向资源(而不是文字)。
清单6显示了完整的配置文件,包括两个DE>
属性。
LDAP属性默认分配文字资源谓词。
要注意,可能的话最好使用已有的谓词,这里使用了FOAF本体的一些词汇表。
对于地点也有一个词汇表,不过这里没有用到。
清单6.SquirrelRDF(dw.ttl)映射
@prefixrdf:
//www.w3.org/1999/02/22-rdf-syntax-ns#>
@prefixpeople:
@prefixol:
almap:
Map;
server<
ldap:
//:
389/ou=people,o=>
#Personproperties
];
telephoneNumber"
propertypeople:
ol
officeLocation"
ObjectProperty;
manager
manager"
#OfficeLocationproperties
propertyol:
address1
address1"
address2
address2"
city
city"
state
state"
postalCode
postalCode"
.
实验映射
SquirrelRDF提供了运行SPARQL查询的命令行工具。
进一步开发之前先行测试是一种好办法。
将清单7中的查询保存到文件中。
清单7.测试查询(test.rq)
WingCYung"
以DE>
dw.ttlDE>
(映射文件名)和DE>
test.rqDE>
(查询文件名)为参数运行DE>
squirrelrdf.QueryDE>
应该会得到某个人的URI和电话号码。
如果稍微再进一步,清单8查询在某个州工作的所有雇员(可能非常多)。
请注意,查询检索人的姓名和所在城市。
清单8.测试查询(test2.rq)
city?
WHERE{
name?
name.
personpeople:
ol?
officelocation.
officelocationol:
state"
MA"
ol:
city
将SquirrelRDF设置成服务
我们希望将SquirrelRDF设置成一种HTTP服务,以便Web客户机能够使用它。
SquirrelRDF是分布式的,使用简单的Servlet公开HTTP服务端点(DE>
squirrelrdf.ServletDE>
可用喜欢的任何Servlet容器来建立。
允许测试前需要对查询URL编码,以便作为URLDE>
queryDE>
参数传递。
访问http:
//localhost:
8080/squirrel?
query=...(实际位置取决于服务器配置,请参阅参考资料)。
缺省Servlet非常小,只能回答DE>
查询,用标准XML格式表示结果集。
为了使SPARQL端点更有用,可让它支持更多的特性。
执行查询
增加更多的功能之前,我们先要找一种更好的办法测试端点,因为URL编码查询和手工创建URL都很麻烦。
第一个例子使用的通用SPARQL处理程序无法再用,因为它取回执行查询的整个RDF图,我们的SquirrelRDF服务本身是一个能回答查询的SPARQL端点(通过将其转化成LDAP查询)。
创建一个简单HTML表单编写和提交查询。
一个例子是功能更完善的SPARQLer(请参阅参考资料)。
单击Graphs选项卡来设置端点endpoint(比如http:
8080/squirrel)。
单击Change。
建立查询提交的端点。
尝试本文前面用到的查询。
支持其他类型的SPARQL查询
如前所述,DE>
查询很重要,尤其是对非RDF格式存储的数据。
现在,Servlet仅支持DE>
查询,但是底层的查询引擎可以执行全部四种查询类型。
扩展现有的Servlet需要修改DE>
doQuery()DE>
方法,如清单9所示。
com.hp.hpl.jena.query.QueryDE>
对象知道是什么类型的查询,因此可通过它确定DE>
com.hp.hpl.jena.query.engine1.QueryEngineDE>
应该怎么做。
不同的查询类型返回不同类型的数据:
返回布尔值,DE>
和DE>
返回图(从技术上说,返回的是图的包装DE>
ModelDE>
),DE>
返回结果集。
清单9.处理其他类型的SPARQL查询
Queryq=QueryFactory.create(theQuery,"
."
Syntax.syntaxSPARQL);
intqueryType=q.getQueryType();
Modelm=null;
switch(queryType){
caseQuery.QueryTypeAsk:
booleanb=qe.execAsk();
Stringstr=ResultSetFormatter.asXMLString(b);
resp.setHeader("
Content-Type"
"
application/xml"
);
resp.getOutputStream().write(str.getBytes());
break;
caseQuery.QueryTypeConstruct:
//Getsamodel.
m=qe.execConstruct();
application/rdf+xml"
//AModelcanserializeitself.
//Theserializationformatcanbepassedinasanargument,
//defaultistowriteoutasRDF/XML.
m.write(resp.getOutputStream());
caseQuery.QueryTypeD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SPARQL 查询的特点 查询 特点