SPARQL查询的特点.docx
《SPARQL查询的特点.docx》由会员分享,可在线阅读,更多相关《SPARQL查询的特点.docx(8页珍藏版)》请在冰豆网上搜索。
SPARQL查询的特点
SPARQL查询的特点
语义网开创了数据集成的新时代当然,已经有许多不同格式的现成数据。
将所有这些数据转换成RDF(语义网使用的格式)将是一个巨大的工程,所以最好以RDF的形式公开现有的数据介绍了语义网的核心概念和标准,阐述了如何将LDAP目录作为一种服务公开,语义网应用程序可以使用开源的SquirrelRDF工具。
采用了通用灵活的RDF(资源描述框架)标准,为数据共享和集成开辟了一个新时代。
RDF的特性使得跨不同数据源合并数据和查询变得很容易大量数据以其他形式存在,如XML、关系数据库和LDAP目录。
RDF非常灵活,可以完全表达这些格式。
然而,将现有数据转换成RDF是一项巨大而昂贵的任务,并且在许多情况下是不必要的。
一些工具可以将现有数据公开为网络端点,这些端点可以通过语义网的查询语言SPARQL进行查询SquirrelRDF就是其中之一。
这个开源工具(参见参考资料中的链接)是耶拿语义网框架的一部分。
本文的目的是解释如何为可以通过SPARQL查询的LDAP目录创建端点,并介绍一个重要的语义网概念。
在创建了端点之后,我还将解释如何使用一些耶拿Java。
班级得到进一步提高。
最后,使用JavaScript从基于浏览器的客户端进行查询。
什么是
语义网?
语义网是一种新兴的技术,它基于一组表示数据、查询数据和对数据应用规则的标准核心技术包括用于表示的RDF、用于查询的SPARQL、用于构造的RDFS以及用于构造和推理的OWL。
语义网有许多突出的优点,包括更简单的数据集成、更准确的搜索、更方便的知识管理等。
因此,语义网这个词的含义越来越丰富(参见参考资料中关于语义网标准的更多信息)
RDF是语义网的基础:
一种将数据表示为有向加权图的标准资源是以全球唯一的、可解析的URI标记的实体图中的节点是资源和单词。
节点由有向边连接,边用谓词标记。
图表可以序列化,列出图表中的每条边。
每条边称为一条语句,有一个主语(边的源点)、一个谓语(边的标签)和一个宾语(边的汇点)因为每一个命题都有一个主语、谓语和宾语,所以也被称为三元组每个命题的主题必须是一种资源谓词也是资源。
命题的对象可以是资源或文本。
RDF和XML之间有一些重要的区别首先,RDF是基于图的,而XML是基于树的RDF没有明确的顺序。
所有的边形成一个集合,而XML元素有一个顺序。
最后,RDF是一个没有标准序列化的数据模型。
RDF可以序列化为各种形式,包括RDF-XML、n3、简洁RDF三重语言(海龟,参见参考资料)等。
清单1中的示例使用海龟来描述两个人的一些联系信息。
清单1。
RDF
@前缀的示例:
..afoaf:
人;foaf:
name\
foaf:
mbox。
foaf:
phone\
foaf:
knows;电话\
第一行定义了数据前缀,因此可以缩写为您可以指定多个前缀此外,海龟使用分号(DE>);DE>)意味着后续行中的谓词和对象使用相同的主语。
谓词是一个RDF类型的谓词(谓词>粘贴到目标图URI字段中)输入查询并单击获取结果后,将检索并查询海龟文件。
SPARQL有四种类型的查询:
DE>SELECTEDE>:
返回一组满足查询的变量绑定(类似于SQLDE>SELECTDE>)非常适合生成供应用程序使用的数据
DE>构造者>:
返回一个图(一组RDF命题)适用于检索和转换RDF返回一个布尔值,指示查询结果是否存在
de>描述符>:
依赖于实现接收资源并返回描述该资源的图形清单2演示了DE>SELECTDE>查询
清单2。
示例
查询:
前缀Foaf:
选择?
人?
电话:
{
?
个人foaf:
姓名\?
电话?
phone}
结果:
-|person|phone|
================================================================================合并数据非常方便,因为CONSTRUCT图中的谓词不一定与原始图中的相同。
这个列表查询的是电话号码,但是一个新的图表是在它的位置使用不同的谓词构建的
清单3。
SPARQLCONSTRUCT查询示例:
前缀FOAF:
前缀风:
CONSTRUCT{
?
个人foaf:
姓名\?
办公室电话?
电话}哪里{
?
个人foaf:
姓名\?
电话?
如何定义phone}
结果:
foaf:
phonede?
您可以访问代码>/foaf/0.1/电话代码>
数据的结构不受限制XML是分层的,在关系数据库中建模(和查询)图形结构非常困难。
SPARQL不需要设计数据访问接口搜索应用编程接口(如搜索员工)通常要么功能非常有限,要么过于复杂。
数据易于合并合并数据(不同的图)是一个简单的操作,只需要建立一个包含图中所有三元组的集合。
世界上唯一的资源减少了歧义如果有必要,OWL规则可以用来将不同URIs的资源映射到同一个URI
可以添加结果(使用RDFS和OWL),但结构不是强制性的向资源添加未指定的属性不会使数据无效它也不会破坏与数据交互的现有代码。
SquirrelRDF入门
Jena语义网络框架包括RDF存储和查询执行组件SquirrelRDF是一个工具,它公开关系数据库和LDAP中的数据,以便通过SPARQL进行查询本文主要讨论SquirrelRDF的LDAP组件。
(有关这些项目的更多信息,请参见参考资料
LDAP目录本身的结构可以很容易地转换成RDF每个LDAP对象类都有一组属性其中一些属性指向文字值(如名称),而其他属性指向其他对象(如由DN指定的工作区)
下载SquirrelRDF源代码耶拿也是必需的(下载推荐版本)SquirrelRDF主页详细介绍了所需的各种信息(参见参考资料)安装
后,第一步是找到LDAP存储模式如果没有要测试的LDAP存储,您可以安装OpenLDAP并按照说明创建一个简单的地址簿(请参见参考资料,尽管这可能不是必需的,因为本文的目标是利用现有的数据源)该模式包含所有不同的对象类及其属性
可以通过分析属性来确定目录中对象之间的关系。
这个例子使用了一个非常简单的LDAP模式其中,德>人>类包含一些基本属性(如姓名和电话),并指向另一个对象类德>办公地点德>De>办公地点>包括名称、两个街道地址字段、城市和州“人员”也有一个指向另一个“人员”的经理属性
现在创建从LDAP模式到RDF的映射SquirrelRDF使用RDF文件来表示这种映射谓词指定了LDAP存储的位置映射允许分配两种类型的RDF谓词:
文字对象或资源对象姓名和电话等基本属性被映射到文字对象谓词中。
这种类型的映射需要LDAP属性名和RDF谓词名然后,您可以将它链接到资源假设需要映射到清单4创建了一个要链接的资源,然后将它链接到配置资源
清单4。
SquirrelRDF文本映射
@前缀Foaf:
。
@前缀Lmap:
。
Lmap:
Mapprop:
NameMapping.
:
NameMappingLmap:
PropertyFoaf:
Name;Lmap:
属性\
请注意,将这些连接在一起的URIs是不相关的,可以用空白节点代替,即没有URIs的资源它不同于空白的URI的资源,并包括这些资源。
空白URI是一个相对URI,因此解决海龟文件的位置
清单5用一个空白节点替换了资源,并用方括号表示两个命题片段都使用了一个空白节点主题。
这些方括号出现在谓词之后,表示空节点是命题的对象。
清单5。
SquirrelRDF文本映射到一个空节点@prefifaf:
。
@prefifmap:
。
lmap:
mapsprop
[lmap:
propertfaf:
name;要映射指向专有名词的LDAP属性,您可以将空白节点的类型指定为这确保了分配的谓词指向资源(而不是文本)清单6显示了完整的配置文件,包括两个属性默认情况下,LDAP属性分配
个文字资源谓词请注意,如果可能的话,最好使用现有的谓词,这里使用了一些FOAF本体的词汇这里还有一个位置术语表,但是这里没有用到。
清单6。
映射
@前缀RDF:
。
@前缀LMAP:
。
@前缀人:
。
@前缀OL:
。
ALMAP:
地图;
lmap:
服务器;
#个人属性lmap:
映射
[lmap:
属性foaf:
名称;lmap:
属性\lmap:
MapSprop
[lmap:
propertyfoaf:
phone
;lmap:
attribute\lmap:
MapSpop
[lmap:
propertypeople:
ol
;lmap:
属性\;almap:
ObjectProperty;];lmap:
mapsProp
[lmap:
物业人员:
经理;lmap:
属性\;almap:
ObjectProperty;];
#OfficeLocation属性lmap:
mapsProp
[lmap:
属性ol:
address1;lmap:
attribute\lmap:
MapSprop
[lmap:
propertyol:
address2;lmap:
attribute\lmap:
MapSprop
[lmap:
propertyol:
city;lmap:
属性\lmap:
MapSprop
[lmap:
propertyol:
state;lmap:
attribute\lmap:
MapSprop
[lmap:
propertyol:
PostalCode;Lmap:
属性\。
实验映射
SquirrelRDF为运行SPARQL查询提供了命令行工具在进一步开发之前进行测试是一个好方法将清单7中的查询保存到一个文件中
清单7。
测试查询(测试。
前缀:
选择?
人?
电话:
{
?
个人foaf:
姓名\?
电话?
电话}
运行。
查询代码>以代码>dw.ttlDE>(映射文件名)和代码>test.rqDE>(查询文件名)作为参数你应该得到某人的URI和电话号码。
如果你更进一步,清单8查询在一个州工作的所有雇员(可能很多)请注意,搜索者的姓名和城市被查询。
清单8。
测试查询(test2.rq)
前缀foaf:
选择?
人?
城市?
说出{
?
人名?
名字。
?
人物:
ol?
officelocation。
?
officelocationol:
state\ol:
city?
城市}
将SquirrelRDF设置为服务
我们希望将SquirrelRDF设置为一个HTTP服务,以便网络客户端可以使用它
SquirrelRDF是分布式的,它使用一个简单的Servlet来公开HTTP服务端点。
ServletDE>)它可以用任何你喜欢的Servlet容器来构建。
允许在测试之前对查询网址进行编码,并将其作为一个参数传递访问。
对象知道它是什么类型的查询,因此它可以用来确定de>com.HP.HPL.jena.query.engine1.queryengende>应该做什么。
不同的查询类型返回不同类型的数据:
德>ASKDE>返回布尔值,德>构造德>和德>描述>返回图(技术上,返回图的包装>模型德>),德>选择德>返回结果集
清单9。
处理其他类型的SPARQL查询。
\intquerytype=q.getquerytype();模型m=空;开关(QueryType){
案例查询。
QueryTypeAsk:
布尔b=QE.ExecAsk();
字符串=ResultSetFormatter.AsXMLString(b);resp.SetHeader(\resp.GetOutputStream()。
write(str.GetBytes());休息;
案例查询。
查询类型构造:
//获取模型。
m=QE.ExecConstruct();
resp.SetHeader(\
//模型可以序列化自身。
//序列化格式可以作为参数传入,//默认是以RDF/XML的形式写出。
m.write(resp.GetOutputStream());休息;
案例查询。
queryTypeDescript:
m=QE.ExecConstruct();
resp.SetHeader(\m.write(resp.GetOutputStream());休息;
案例查询。
查询类型选择:
结果集结果=QE.ExecSelect();
resp.SetHeader(\
ResultSetformatter.OutputsXMl(resp.GetOutputStream(),结果);休息;}
获取JSON输出
JSON是一种数据序列化格式,可用于创建带有JavaScript计时器的对象JSON经常被用作一种网络数据访问格式,因为基于JavaScript浏览器的应用程序可以使用结构化数据,而不需要解析XML数据(参见参考资料)清单10显示了清单2和3的JSON格式结果
清单10。
JSON查询结果{
\
\},
\
\\\{
\\}]}}
de>com.HP.HPL.jena.Query.resultsetformade>工具类用于输出SPARQL查询结果清单9使用它以XML格式输出结果(查询)结果也可以是RDF格式的。
毫不奇怪,使用这个工具类还可以将结果绑定到JSON,如清单11所示
清单11。
将JSON添加到SPARQL查询支持字符串输出=请求。
GetParameter(\if(输出。
等于(\
RESP。
setHeader(\
ResultSetFormatter。
RESP。
获取输出流(),结果);}
支持XSLT
以XML形式从SPARQL结果集中提取数据的另一种方法是应用XSLT清单12显示了一个SPARQL结果集XML的例子元素包含所有变量,结果元素包含一个结果列表,每个结果列表包含一个绑定
可以向服务器添加XSLT服务,通过外部XSLT服务处理查询结果,或者再次向XML输出添加样式表链接向XML输出添加一个样式表链接,并将它作为一个新参数传递给XSLTURI,如清单13所示。
这并不执行转换,只是在生成的文档中包含一个到XSLT的链接当XSLT处理器(如现代网络浏览器)准备文档时,转换被执行(参见参考资料)
清单12。
结果