標準化目前:注目のXML問い合わせ言語
XQuery
 〜後編

これまで2回に渡って、XQueryのデータモデル、表現式について紹介してきた。最後となる今回は、リレーショナルデータベースで広く用いられている問い合わせ言語SQLとXQueryを比較することによって、XQueryの特徴を浮き彫りにしていく。

戌亥稔
ビーコンIT
2002/4/24


SQLとXQueryはどう違う?

 リレーショナルデータベースは和、共通、差、射影、選択、直積、結合、割算の8つの集合演算から成り立っています。ここではその中からXQueryにかかわる選択、射影、直積、結合の4つの演算について説明します。

リレーショナルモデルの演算とは

 まずリレーショナルモデル(ここではSQL)における演算の説明をしておきましょう。リレーショナルモデルに詳しい方は、次のXQueryの演算のところまで読み飛ばしていただいて構いません。

図1 主なリレーショナルモデルの演算(クリックで拡大します)

(1) 射影(Projection)

テーブルから必要なカラムだけを取り出すことを射影(Projection)と呼びます。SQLでは「SELECT [カラム名1],[カラム名2] … FROM テーブル名」のように、SELECT文中のカラム名のリストで表すことができます。

(2) 選択(Selection又はRestriction)

テーブルから必要なレコードだけを抜き出すことを選択(SelectionまたはRestriction)と呼びます。SQLでは「SELECT * FROM … WHERE [条件式]」の、WHERE節以降に記述する条件式により決定されます。図1の右上では「SELECT * FROM Membertable WHERE Start >="2002/2/1"」の実行結果を示しています。

(3) 直積(Cartesian Product)

図1の下の部分のように、2つの表から、あり得るすべての組み合わせを作ることを直積(Cartesian Product)と呼びます。SQLでは「SELECT * FROM ProjectTable, Member Table」と、FROM節に2つ以上のテーブルを記述することで直積を作れます。直積はまた、同じテーブル名から作ることも可能です(例:SELECT * FROM MemberTable, MemberTable)。

(4) 結合(Join)

2つ(もしくはそれ以上)の表から関連する情報を使って1つの表を作成することです。結合(Join)は図2のように直積と選択の2つのオペレーションの組み合わせで行います。SQLにおいては「SELECT * FROM ProjectTable, MemberTable WHERE ProjectTable.Pcode = MemberTable.Pcode」と、FROM節とWHERE節の組み合わせで作成することが可能です。

図2 リレーショナルモデルによる結合を示した

XQueryの演算

 XQueryの演算についてはW3Cの「XQuery 1.0 Formal Semantics」で定義されています。ただし、現時点ではXQuery 1.0: An XML Query LanguageとXQuery 1.0 Formal Semanticsは完全には整合性が取られていないので、最新の情報として「XQuery 1.0 Formal Semantics 」を参照してください。

(1) 射影(Projection)

 リレーショナルと同様に射影が定義されています。XQueryにおける射影とは、Path表現式により実装されています。例えば次の問い合わせは、projects.xmlから、メンバーに関する情報だけを射影することができます。リレーショナルの場合はカラム名のリストという形で、1項目ずつ指定をしますが、XQueryの場合はノードリストで指定をします。故にXMLの階層構造に対して、指定されたノード以下(forest:フォレスト)の木構造を、射影として作成します。

document("data\projects.xml")//member

 1つのエレメントを射影したい場合は末端のエレメント名を指定しなければなりません。

document("data\projects.xml")//member/name

(2) 選択(Selection)

 XQueryにおける選択は、Path表現式のフィルタ機能またはFLWR表現式のwhere句によって行われます。Projects.xmlに対して2002年2月1日以降に始まったプロジェクトを選択したい場合、Path表現式の場合は次のように記述できます。

for $p in document("data\projects.xml")//project[@start>="2002/02/01"]
let $pn := $p/name/text()
return
<project> <title>{ $pn }</title>
<member>{ $p//member/name } </member>
</project>

 一方、FLWR表現式のwhere句で選択をする場合は、次のようになります。

for $p in document("data\projects.xml")//project
let $pn := $p/name/text()
where $p/@start>="2002/02/01"
return
<project> <title>{ $pn }</title>
<member>{ $p//member/name } </member>
</project>

 どちらの問い合わせも同様の結果をもたらします。

(3) 繰り返し(Iteration)

 リレーショナルの場合は1つの項目の中に複数の値を持つことを許しません。一方XML文書では要素の繰り返しを持つことができるため、XQueryには繰返し(Iteration)という操作が存在します。次のように、繰り返しはfor句で表すことができます。

for $pn in document("data\projects.xml")//project/name
return
<tuple>
{ $pn }
</tuple>

 この操作はある意味、XML文書を細かく分解することを目的としているように思われます。これにより、ある繰り返しを持つある要素の中の、子要素が繰り返しを持つ場合についても、for句をネストして処理することができます。

for $p in document("data\projects.xml")//project,
$m in $p//member
return
<tuple>
{ $p/name }
{ $m }
</tuple>

<?xml version="1.0"?>
<xql:result xmlns:xql="http://metalab.unc.edu/xql/">
  <tuple>
    <name>XMLによる文書管理システム</name>
    <member>
      <name>川泉陽一</name>
      <manpower unit="hour">100</manpower>
    </member>
  </tuple>
  <tuple>
    <name>XMLによる文書管理システム</name>
    <member>
      <name>中田聡</name>
      <manpower unit="hour">50</manpower>
    </member>
  </tuple>
  <tuple>
    <name>XMLによるB2Bシステム構築</name>
    <member>
      <name>本岡欣也</name>
      <manpower unit="hour">100</manpower>
    </member>
  </tuple>
  <tuple>
    <name>XMLによるB2Bシステム構築</name>
    <member>
      <name>川泉陽一</name>
      <manpower unit="hour">50</manpower>
    </member>
  </tuple>
  <tuple>
    <name>モバイルシステムの構築</name>
    <member>
      <name>川泉陽一</name>
      <manpower unit="hour">10</manpower>
    </member>
  </tuple>
</xql:result>

5/6

Index
注目のXML問合せ言語「XQuery」
  XML問い合わせ言語とデータモデル
・問い合せ言語の役割
・XML問い合わせ言語が求められる理由
・XML問い合わせ言語とデータモデル
・XMLの基本データモデルはツリー構造
  XQuery以前に提案された問い合わせ言語
・XML-QL
・XQL
・XML問い合せ言語として必要な機能
・QuiltとXQuery
  2つの表現式、PathとFLWR
・表現式はシーケンスで表される
・Path表現式
・FLWR表現式
  FLWR表現式の詳細
・XQueryを試せるアプリケーション
・for句とlet句の違いは繰り返し
・Path表現式とFLWR表現式の違い
コラム:複数のXML文書をXMLデータベースでどう扱うか?
SQLとXQueryはどう違う?
・リレーショナルモデルの演算とは
・XQueryの演算
  XQueryにおけるリレーショナルの演算
・リレーショナルモデルの演算とは
・XQueryの演算
・トランスフォーメーション
・次の課題は更新系の命令


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間