|
XQuery 是一种用于文件和数据库中基于 XML 标记文档内容的新型查询语言。本文简要介绍了 XQuery 出现的前因后果,并和 SQL 的处理机制进行了一定的对比。
SQL 有时能够很好地处理 XML 文档,有时却不行。现在一种由 SQL 专家们开发的新的查询语言正有望解决这些问题,它能够让我们重新审视这一切。
今天我们离开 XML 来讨论软件行业的未来已经是不可能的了,XML 变得如此重要,以至于当我们回答"哪种查询语言能被所有主流数据库软件公司所支持"这个问题时,SQL 已不再是其固有的答案。新时代的宠儿是 XQuery,这是一种用于文件和数据库中基于 XML 标记文档内容的查询语言。
XQuery 是由一些 SQL 专家们制订,由 W3C 联盟发布的一种规范,它的出现是因为 SQL 这种用于关系数据查询的语言无法完美地处理 XML 文档。虽然当 SQL 表与 XML 文档之间有合适的映射时,SQL 能够很好地处理 XML 数据,但这并不是一个通用的解决方案:有些 XML 文档并没有存储在数据库中,有些在它的内容被插入到一个 SQL 数据库前数据已经被切割分离,还有一些没有被分解,而是以 XML 格式存储在 SQL 数据库中。
同时,XML 文档本身很自然地引起对 SQL 在其他方面地位的挑战。XML 文档是分层或树型结构的数据,它们能够对自身的内容和标识(标记内容的标签)自描述。在 DB2 之类的 SQL 数据库中,独立的行不包括列名或列类型描述,因为这些信息保存在数据库系统目录中。但 XML 模型则不同,与 SQL 相比,schema 定义了字段名以及类型信息。当然,即使不用 schema 也是可以处理 XML 文档的,XML 文档本身便包含了嵌入的标识来标记它的内容。但和 SQL 不同,存储和查询 XML 文档时,次序非常重要,因此文档中元素之间的嵌套和它们的先后顺序必须被记录在 XML 文档中。
许多针对文档的查询需要根据节点的位置关系来正确地遍历文档树。当分离文档内容并映射它们到数据库中的列时,必须存储关于文档结构的信息。甚至在映射 XML 内容到 SQL 的列时通常还需要知道遍历的逻辑,这样才能正确遍历整个文档树。其他关于查询 XML 文档的必要条件还包括模式匹配、计算、表达式、函数以及同名称空间和模式一起工作等。
XQuery 的诞生
由于各种各样的原因,W3C 在 1998 年召集了一个工作小组讨论 XML 文档查询的方案,并且于 1999 年成立了 XML 查询工作组。这个工作组从 2000 年开始与扩展样式语言(XSL)工作组合作。
XML 查询工作组包括的成员涉及查询语言设计、查询优化和 SQL 标准演变等领域,具有代表性的公司有 IBM、AT&T、BEA、贝尔实验室、DataDirect、微软和Oracle,他们共同工作并形成了一系列的文档,这些文档包括需求规范、数据模型和查询代数、处理模型、形式语法、用例、序列化规范和一个 XQuery 语言规范。
在今年的早些时候,XML 查询工作组交付了一个 XQuery 1.0 规范的工作草案,用于公开评审以及与 XSL 工作组共同推动 XPath 2.0 规范的发展,XPath 是用于提供对文档内容寻址的语法规范。XQuery 1.0 支持所有的 XPath 2.0 表达式。两者之间的一个不同之处是 XQuery 表达式返回一个排好序的节点序列,而 XPath 表达式返回的是一个节点集合。XQuery 通过返回与文档顺序一致的节点序列来保持与 XPath 的兼容。
XQuery 如何工作?
在 XQuery 语言中的一个查询包含了一个或几个查询表达式。XQuery 支持条件表达式、元素构造器和 FORM、LET、WHERE、RETURN(FLWR) 表达式,表达式包括了一些运算符、函数调用、量化、类型检查和路径表达式。一些 XQuery 表达式求出简单节点的值(例如元素和属性)或原子节点的值(例如字符串和数字)。查询也能求出这两种节点的次序和简单值。
XQuery 的查询结果是 XML 查询数据模型的实例。它使用了 XML schema 类型并且提供编译时的静态类型和运行时的动态类型,同时也支持原始的和衍生的类型。
在任何关于 XQuery 的讨论中,你可能都会经常听见与 FLWR 表达式相关的内容,这是一种用 FOR、LET、WHERE、RETURN 子句来进行查询、过滤和传送记录的语法。一个 FLWR 表达式创建一些绑定,应用一个谓词逻辑,并且产生一个结果集。FOR 用于创建对选定节点的绑定,而 LET 用于创建对单个节点的绑定,FOR 子句可以嵌套使用,这在 XQuery 反复对结果序列进行循环处理时非常有用。
XQuery 没有遵循 SQL 的一些惯例。例如,SQL 没有节点的实质概念,并且不能基于一棵树中节点位置进行遍历或存储信息。而 XQuery 1.0 目前并不支持数据的更新,虽然这点在新版本的计划中将得到支持。
但是 XQuery 和 SQL也共享了一些相似的概念。这两种语言都提供了关键字用于投影和变换操作(如 SQL 中的 SELECT 和 XQuery 中的 RETURN)。SQL 支持表的联合,XQuery 也支持多个文档之间的联合。XQuery 也能通过 WHERE 进行信息过滤,通过 ORDER BY 进行排序。XQuery 和 SQL 都提供了函数调用和用户自定义函数等功能。
XQueryX
除了修订 XQuery 外,XML 查询工作组还开发了一个 XQueryX 的草案,这是一种使用 XML 来描述 XQuery 的语法。XQueryX 定义了一种映射方法,它将 XQuery 语法表达的查询映射到 XML 表达的查询。与 XQuery 对应的 XQueryX 比较冗长,易读性并不是它的主要好处。开发 XQueryX 的动机是简化解析工作和支持一些操作,例如针对查询结果的查询和将查询转换为新查询等操作。列表 1 显示了使用 XQuery 语言表达一个查询的例子,列表 2 显示了与同一查询相对应的 XQueryX。
列表1:XQuery 示例
列表2:用 XQueryx 表达的 XQuery 示例
IBM 和 XML
从第 5 版开始,DB2 通用数据库(UDB)已经成为一个强大的平台,可以用于管理和查询丰富的数据类型。甚至在 W3C 发布 XML 1.0 规范之前,IBM 就已经增强了 DB2,使其具有强大的文本处理能力。由于 XML 是文本,DB2 Text Extender 提供了一种早期的解决方案用于管理、索引和查询 XML 文档集合。
2000 年 IBM 用 DB2 XML Extender 增强了 DB2 Text Extender 的功能,并开发了一个 XML 解析器。XML Extender 提供了多种选择来存储 XML,同时支持 XML文档和 WebSphere MQ 消息队列的集成。SQL 的共同设计者之一,IBM 的 Don Chamberlin 也承担了一种 XML 查询语言的开发工作,Chamberlin 和研究员 Jonathan Robie、Daniela Florescu 共同发明了Quilt,这种查询语言是 XML 查询工作组构建 XQuery 的基础。
IBM 的 alphaWorks 是一个致力于将新兴技术的测试版本向开发者推广试用的网站,它发布了用于表的 XML(XML for Tables),其提供了一种针对关系表的 XML视图和对这些视图进行查询的 XQuery。在查询 DB2 数据库时,用于表的 XML 将 XQuery 映射成为 SQL,它获取来自 SQL 查询的元组结果输出,然后加上标记生成为 XML 输出。用于表的 XML 很大程度上依赖于 DB2 的存储过程。
XML 查询是 IBM Xperanto 项目的一个重要方面,这个项目提供对异构数据源的集成和对联邦数据库的支持技术。IBM 已经增强了 DB2 控制中心,例如,你可以通过它来配置联邦数据库对象。这种技术建立在 IBM 从 Garlic 项目、DiscoveryLink 和 DB2 DataJoiner 获取的知识基础之上。5 月份已经上市的 DB2 Information Integrator 便是来自于这个项目,它支持结构化、半结构化和非结构化数据的集成。DB2 Information Integrator 能在使用诸如表联合、表函数和联合视图等访问异构数据时进行查询优化,这些异构数据包括了电子数据表、Web 服务和 DB2 数据表。它也能够通过 DB2 函数来调用一个 Web 服务或者放入一个信息到队列中来得到数据,它还能够通过 XQuery 来定义和使用XML视图。
DB2 Information Integrator 还将在未来版本中提供对 XQuery 的支持(该支持同样会在 DB2 UDB 和 DB2 内容管理产品(DB2 Content Manager)中提供)。这个支持将允许 DB2 像对待一个虚拟数据库一样处理 XML 文档集合(包括那些没有存储在 DB2 中的 XML 文档)。
Java 和 XQJ
2003 年 6 月,IBM 和 Oracle 通过 Java Community Process 合作开发针对 XQuery 的 Java 编程接口。在新的 Java 规范需求(JSR 225)基础上工作的专家组将会开发一种规范,用于 Java 的 XQuery 应用编程接口(XQJ)。IBM 正在帮助开发 XQJ 规范和一个技术兼容工具包。
XQJ 将允许 Java 开发者使用 XQuery 来访问数据库,就像 JDBC 允许 Java 开发者使用 SQL 进行数据访问操作一样。XQJ 将定义接口和类来支持针对文档集合或单个文档的查询。它将共享 JDBC 中的一些常用概念,例如支持事务处理、面向连接的接口、预编译查询和参数查询等。XQJ 也将支持对查询结果的处理,这种处理可以使用 XML 流 API,也可以使用针对 XML 处理的 Java API(JAXP),包括 JAXP 序列化来进行。XQJ 还将提供一种反复或游标模式用于遍历查询结果。
大部分的软件公司正在驾驭面向服务体系架构的浪潮,包括网络与网格服务。新一代软件架构在 XML 和以文档为中心的处理模型上。同时以 XML 编码的文档也成为新的事务处理标准和新一代电子商务应用程序的典型模式。
在处理文档和处理数据之间还有一些基本的差异。XQuery 和 XPath 表达式提供了方案来解决 SQL 在对文档结构进行遍历和定位操作上的不足之处。
在 DB2 和 DB2 Information Integrator 中对 XQuery 的支持将使丰富的开发和数据库管理环境更加完美,以达到用户对 IBM 数据库产品的期待。XQuery 和 DB2 Information Integrator 可以让用户搜索 DB2 数据库和外部文件中 XML 文档的内容,并且整合来自各种 XML 数据源中的信息。
由于增加了 XQuery 支持功能,DB2 用户现在有了两种标准解决方案(SQL 和 XQuery)来从数据库或文档中查询信息,并且由于 XQuery 是由 SQL 的行家们开发的,有经验的 SQL 用户将很熟悉和了解 XQuery 中的概念。XQuery 将成为 DB2 用户一个强大的新工具,帮助他们在文档集合中发现信息。 |
|