以文本方式查看主题 - W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWL (http://bbs.xml.org.cn/index.asp) -- 『 Semantic Web(语义Web)/描述逻辑/本体 』 (http://bbs.xml.org.cn/list.asp?boardid=2) ---- [转] SPARQL 查询的特点 (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=87783) |
-- 作者:admin -- 发布时间:11/18/2010 10:08:00 AM -- [转] SPARQL 查询的特点 语义 Web 为更轻松的数据集成开辟了一个新时代。当然,已经有很多现成的数据以各种不同的格式存在。要将所有这些数据转化成 RDF(语义 Web 使用的格式)将是一项庞大的工程,因此最好将已有的数据作为 RDF 公开。本文介绍了语义 Web 的核心概念和标准,阐述了如何将 LDAP 目录公开为语义 Web 应用程序可使用开放源码 SquirrelRDF 工具使用的服务。 本文的目的在于说明如何为 LDAP 目录创建可通过 SPARQL 查询的端点,同时介绍了重要的语义 Web 概念。建立端点之后,我还将说明如何使用一些 Jena Java? 类进一步完善,最后使用 JavaScript 从基于浏览器的客户端查询它, 什么是语义 Web? 语义 Web 是一种新出现的技术,它以表示数据、查询数据和对数据应用规则的一组标准为基础。核心技术包括用于表示的 RDF、用于查询的 SPARQL、用于构造的 RDFS 以及用于构造和推理的 OWL。语义 Web 有很多突出的优点,包括数据集成更简单、搜索更精确、知识管理更方便等等,结果语义 Web 这个词的含义越来越丰富(关于语义 Web 标准的更多信息请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL])。 RDF 是语义 Web 建立的基础:将数据表示成有向加权图的一种标准。资源 是用全局惟一的、可解析 URI 标记的实体。图的节点是资源和文字,节点之间用有向边连接,边上用谓词标记。图可以序列化,列举图中的每一条边。每条边称为一个命题(statement),都有一个主语(subject)(边的源点)、一个谓词(边的标号)和一个宾语(object)(边的宿点)。由于每个命题都有主语、谓词和宾语,也被称为三元组。每个命题的主语必须是一个资源。谓词也是资源。命题的宾语可以是资源或者文字。 RDF 和 XML 有一些重要的区别。首先,RDF 是基于图的,而 XML 是基于树的。RDF 没有明确的顺序,所有的边组成一个集合,而 XML 元素是有顺序的。最后,RDF 是一种不含标准序列化的数据模型。RDF 可以序列化成多种形式,包括 RDF-XML、n3、Terse RDF Triple Language(Turtle,请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL])等。清单 1 中的例子采用 Turtle 描述了关于两个人的一些联系信息。 虽然 RDF 的格式很自由,但可用 OWL(Web 本体语言)通过定义概念的谓词词汇表和关于谓词的规则来限制数据的结构(关于 OWL 的更多信息请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL])。OWL 本体的一个例子是 Friend of a Friend (FOAF),用于表达联系人信息及相互关系的 RDF 数据(关于FOAF 的更多信息请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL])。本体可以定义数据类(比如 DE>foaf:PersonDE>),限制主语和宾语的类型(DE>foaf:knowsDE> 的主语和宾语必须是 DE>foaf:PersonDE> 类型,并对谓词的基数进行限制。只要可能应尽量使用 FOAF 这类通用本体,公共的结构和词汇表有助于数据的集成。 使用 SPARQL 查询 RDF SPARQL 是语义 Web 的标准查询语言。其语法类似于 SQL,SPARQL 查询包括一系列的三元组范型和修饰符。SPARQL 被设计成能够查询 Web 上分布的多个数据源。 试验下面的查询可使用通用的 SPARQL 处理程序(请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL])。将 DE>http://wingerz.com/dw/listing1.ttlDE> 粘贴到 Target graph URI 字段中。输入查询并单击 Get Results 之后,就会检索 Turtle 文件并进行查询。 SPARQL 有四种类型的查询: DE>SELECTDE>:返回满足查询的一组变量绑定(类似 SQL DE>SELECTDE>)。非常适合产生应用程序要消费的数据。 Result: Result: 以 RDF 格式存储数据的好处 初看起来,RDF 数据似乎有点笨拙而且非常罗嗦。但是有一些突出的优点。 RDF 数据是自描述的。RDF 图包括数据和结构。资源通常是可解析的。如果看到[URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#listing1]清单 1[/URL] 所示的 RDF 但不知道 DE>foaf:phoneDE> 是如何定义的,可以在 Web 浏览器中访问 DE>http://xmlns.com/foaf/0.1/phoneDE>。 数据的结构没有限制。XML 是层次化的,在关系数据库中建模(和查询)图结构非常困难。 SPARQL 不需要设计数据访问接口。搜索 API(比如搜索雇员)往往不是功能非常有限就是过于复杂。 数据容易合并。合并数据(不同的图)是一项简单操作,只需要建立包含图中所有三元组的集合。全球唯一资源减少了歧义。而且如果必要的话,可以用 OWL 规则将不同 URI 的资源映射到同一个 URI。 虽然可以增加结果(使用 RDFS 和OWL),但结构不是强制性的。向资源添加未指定的属性不会使数据无效。也不会破坏和数据交互的已有代码。 SquirrelRDF 入门 Jena Semantic Web Framework 包括 RDF 存储和查询执行组件。SquirrelRDF 是将关系数据库和 LDAP 中的数据公开以便通过 SPARQL 查询的工具。本文主要讨论 SquirrelRDF 的 LDAP 组件。(关于这些项目的更多信息请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL]。) LDAP 目录本身的结构很容易转化成 RDF。每个 LDAP 对象类都有一组属性。其中一些属性指向文字值(比如名称),另一些则指向其他对象[比如专用名词(DN)指定的工作地点]。 下载 SquirrelRDF 源代码。还需要 Jena(下载推荐的版本)。SquirrelRDF 主页详细介绍了需要的各种信息(请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL])。 安装后,第一步是寻找 LDAP 存储的模式。如果没有可供试验的 LDAP 存储,可以安装 OpenLDAP 并按照使用说明创建一个简单的地址簿(请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL],尽管可能没有必要费这么多事,因为本文的目标是利用已有的数据源)。模式包含所有不同的对象类及其属性。通过分析属性,可以确定目录中对象之间的关系。 该例中使用一个非常简单的 LDAP 模式。其中 DE>PersonDE> 类包含一些基本的性质(比如姓名和电话),同时指向另一个对象类 DE>OfficeLocationDE>。DE>OfficeLocationDE> 包括名称、两个街道地址字段、市和州。DE>PersonDE> 还有一个 manager 属性,指向另一个 DE>PersonDE>。 现在来创建从 LDAP 模式到 RDF 的映射。SquirrelRDF 使用 RDF 文件表示这种映射。DE>lmap:serverDE> 谓词用于指定 LDAP 存储的位置。映射允许分配两种类型的 RDF 谓词:文字宾语或者资源宾语。姓名和电话这类基本属性映射为文字宾语谓词。这类映射需要 LDAP 属性名和 RDF 谓词名。然后即可将其链接到资源。假设需要将 LDAP DE>cnDE> 映射到 RDF DE>foaf:nameDE>。清单 4 中创建了一个资源来进行链接 (DE>:namemappingDE>),然后将其链接到配置资源(DE><>DE>)。 清单 5 中用空白节点替换了资源,使用方括号表明其中的两个命题片断都使用空白节点主语。这些方括号出现在 DE>lmap:mapsPropDE> 谓词之后,表示空白节点是该命题的宾语。 <> a lmap:Map ; # Person properties SquirrelRDF 提供了运行 SPARQL 查询的命令行工具。进一步开发之前先行测试是一种好办法。将清单 7 中的查询保存到文件中。 如果稍微再进一步,清单 8 查询在某个州工作的所有雇员(可能非常多)。请注意,查询检索人的姓名和所在城市。 我们希望将 SquirrelRDF 设置成一种 HTTP 服务,以便 Web 客户机能够使用它。SquirrelRDF 是分布式的,使用简单的 Servlet 公开 HTTP 服务端点(DE>squirrelrdf.ServletDE>)。可用喜欢的任何 Servlet 容器来建立。允许测试前需要对查询 URL 编码,以便作为 URL DE>queryDE> 参数传递。访问 http://localhost:8080/squirrel?query=...(实际位置取决于服务器配置,请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL])。 缺省 Servlet 非常小,只能回答 DE>SELECTDE> 查询,用标准 XML 格式表示结果集。为了使 SPARQL 端点更有用,可让它支持更多的特性。 执行查询 增加更多的功能之前,我们先要找一种更好的办法测试端点,因为 URL 编码查询和手工创建 URL 都很麻烦。第一个例子使用的通用 SPARQL 处理程序无法再用,因为它取回执行查询的整个 RDF 图,我们的 SquirrelRDF 服务本身是一个能回答查询的 SPARQL 端点(通过将其转化成 LDAP 查询)。创建一个简单 HTML 表单编写和提交查询。一个例子是功能更完善的 SPARQLer(请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL])。单击 Graphs 选项卡来设置端点 endpoint(比如 http://localhost:8080/squirrel)。单击 Change。建立查询提交的端点。尝试本文前面用到的查询。 支持其他类型的 SPARQL 查询 如前所述,DE>CONSTRUCTDE> 查询很重要,尤其是对非 RDF 格式存储的数据。现在,Servlet 仅支持 DE>SELECTDE> 查询,但是底层的查询引擎可以执行全部四种查询类型。扩展现有的 Servlet 需要修改 DE>doQuery()DE> 方法,如清单 9 所示。DE>com.hp.hpl.jena.query.QueryDE> 对象知道是什么类型的查询,因此可通过它确定 DE>com.hp.hpl.jena.query.engine1.QueryEngineDE> 应该怎么做。不同的查询类型返回不同类型的数据:DE>ASKDE> 返回布尔值,DE>CONSTRUCTDE> 和 DE>DESCRIBEDE> 返回图(从技术上说,返回的是图的包装 DE>ModelDE>),DE>SELECTDE> 返回结果集。 JSON 是一种数据序列化格式,可用 JavaScript 计时器 DE>evalDE> 来创建对象。JSON 经常被用作 Web 数据访问格式,因为基于 JavaScript 浏览器的应用程序不用解析 XML 数据就能消费结构化数据(请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL])。清单 10 显示了清单 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#listing2]2[/URL] 和 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#listing3]3[/URL] JSON 格式的结果。 从 XML 形式的 SPARQL 结果集中提取数据的另一种办法是应用 XSLT。[URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#listing12]清单 12[/URL] 显示了 SPARQL 结果集 XML 的例子。DE><head>DE> 元素包含所有的变量,results 元素包含 result 列表,每个都包含 binding。 可以向服务器上增加 XSLT 服务,通过外部 XSLT 服务处理查询结果,或者在 XML 输出重增加样式表链接。在 XML 输出中添加样式表链接,将 DE>com.hp.hpl.jena.query.ResultSetFormatterDE> 作为 XSLT URI 的新增参数传递,如清单[URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#listing13] 13 [/URL]所示。这样不会执行转换,只是在生成的文档中包括到 XSLT 的链接。当 XSLT 处理程序(比如现代 Web 浏览器)准备文档的时候就会执行转换了(请参阅 [URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL])。 有时候希望建立自己的 Web 用户界面(UI)或者从 JavaScript 应用程序中运行 SPARQL 查询。[URL=http://www.chineselinuxuniversity.net/articles/2923.shtml#resources]参考资料[/URL] 中提供了可免费下载的 SPARQL JavaScript 库。主要用于处理 SPARQL DE>SELECTDE> 查询返回的 JSON 格式的结果。所幸的是,可以让 SPARQL 服务支持这种功能。该库背后最突出的思想是转换器的概念——SPARQL 端点的 JSON 输出包含一般客户机可能用不到的一些数据,比如某些数据类型信息。转换器将 JSON 输出转换成更容易使用的、更自然的对象。 |
-- 作者:jj_long -- 发布时间:12/11/2010 12:34:00 PM -- 学习! |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
50.781ms |