一気に分かる“XQuery”ハンズオン演習

DB基礎講座:XQueryとSQLはどう違う?

一気に分かる“XQuery”ハンズオン演習

日本アイ・ビー・エム
米持幸寿
2006/7/6

FLOWR構文を使ったXQuery演習

 XQueryの基本構文は、以下のようになります。

for $変数名 in 式
let $変数名 := 式
order by 式
where 式
return 式

 すべてを書くわけではなく、省略しつつ組み合わせて記述していきます。

変数への代入と戻り値

 対象となるXMLをFLOWR構文で扱うためには、変数に代入することと、戻り値を構成します。変数は「$」に文字列を足したもので表します。XQueryでは、関数が返してよこすXMLが複数にわたる場合、それを順番にイテレート(順次処理)します。forで変数に代入した関数の結果は、それぞれ変数に代入されてイテレートされるので、4つのXMLインスタンスが処理されるなら、変数の処理が4回、ループのように行われます。

for $input in db2-fn:xmlcolumn("DIR.INFO")
return $input
リスト2 forによるイテレート処理

 これはリスト1の関数のみを実行したときと同じ結果が返ります。

XPathによる出力の調整

 次にXPathによって出力を調整してみましょう。4回出力されるXMLですが、それぞれのXML出力のうち、最初のディレクトリの最初のファイルのエレメントのみを出力させるようにreturn句にXPathを使って指定してみます。

for $input in db2-fn:xmlcolumn("DIR.INFO") 
return $input/dir[1]/file[1]
リスト3 return句にXPathを使用する

 すると、リスト4のように3つの出力しか戻らなくなります(以下、出力結果の改行は調整してあります)。これは、4つのうち1つには「最初のdir要素の下の最初のfile要素」という条件が当てはまらなかったためです。

<file name="config.ini">
   <lastModified>2006/06/02 14:37:44</lastModified>
   <length>3269</length>
</file>
<file name="com.ibm.etools.emf.event_3.0.0.3.jar">
   <lastModified>2006/02/27 18:08:00</lastModified>
   <length>107550</length>
</file>
<file name="readme_eclipse.html">
   <lastModified>2006/06/02 14:37:44</lastModified>
   <length>103569</length>
</file>
リスト4 リスト3の出力結果

 では次により深いファイルをすべて探して、ファイルの大きさが10Mbytes以上のものをすべて表示してみましょう。

for $d in db2-fn:xmlcolumn("DIR.INFO")
return $d//file[length > 10000000]
リスト5 出力の条件に「ファイルサイズ10Mbytes以上」を加えた

 このクエリを実行すると、リスト6の結果が出力され、Eclipseのディレクトリ内には10Mbytes以上のファイルが2個あることが確認できます。結果は一瞬で返ってきますので、ディレクトリ内の10Mbytes以上のファイルを探すよりはるかに早いことが実感できます。

<file name="doc.zip">
   <lastModified>2006/02/24 11:58:00</lastModified>
   <length>11381642</length>
</file>
<file name="org.eclipse.platform.doc.isv_3.2.0.v20060602-1302.jar">
   <lastModified>2006/06/02 14:37:42</lastModified>
   <length>25358264</length>
</file>
リスト6 リスト5の出力結果

 このような抽出はXQueryというよりXPath式の処理によってなされています。ところで、この結果にはちょっと困ったことがあります。それはルート要素がないことです。これではこの結果をそのまま使うためにはルート要素を別途付けなければなりません。ルート要素を付けるためには、「{ }」で囲んだXQueryを発行してルート要素を付ける構文が使えます。

<result>
{  for $input in db2-fn:xmlcolumn("DIR.INFO")
   return $input//file[length > 10000000]
}
</result>
リスト7 ルート要素を付け加える構文

 これできれいなXMLが戻されました。

<result>
   <file name="doc.zip">
      <lastModified>2006/02/24 11:58:00</lastModified>
      <length>11381642</length>
   </file>
   <file name="org.eclipse.platform.doc.isv_3.2.0.v20060602-1302.jar">
      <lastModified>2006/06/02 14:37:42</lastModified>
      <length>25358264</length>
   </file>
</result>
リスト8 リスト7の出力結果

 リスト8を見て「SOAPのEnvelopeとBodyを外側に付けるとWebサービスになるなぁ」と思ってしまいました。

where句とorder by句

 次に条件を使った処理をして、ソートしてみましょう。forで変数に取り込む対象を、関数が返してよこすXMLの下にある「すべてのfile要素」と変更します。そして、lastModifiedが「2006/06/20 00:00:00」より大きなときにreturnが実行されるようにwhere句を追加します。このとき、ファイル名でソートしましょう。

<result>
{  for $input in db2-fn:xmlcolumn("DIR.INFO")//file
   where $input/lastModified/text() > "2006/06/20 00:00:00"
   order by $input/@name
   return $input
}
</result>
リスト9 where句とorder by句の使用

 これによって、2006年6月20日以降に修正された6つのファイルのfile要素が戻されました。属性に付けられているnameでソートされています。

<result>
   <file name=".tmp21584.instance">
      <lastModified>2006/06/23 12:12:26</lastModified>
      <length>0</length>
   </file>
   <file name=".tmp21585.instance">
      <lastModified>2006/06/23 12:12:27</lastModified>
      <length>0</length>
   </file>
   <file name="JavadocHoverStyleSheet.css">
      <lastModified>2006/06/20 13:38:08</lastModified>
      <length>1307</length>
   </file>
   <file name="last.config.stamp">
      <lastModified>2006/06/23 00:39:46</lastModified>
      <length>16</length>
   </file>
   <file name="org.eclipse.ui.ide.prefs">
      <lastModified>2006/06/20 13:30:19</lastModified>
      <length>235</length>
   </file>
   <file name="platform.xml">
      <lastModified>2006/06/23 00:39:45</lastModified>
      <length>17252</length>
   </file>
</result>
リスト10 リスト9の出力結果

 さて、いかがでしょうか。XQueryの応用構文はほかにもたくさんありますが、今回はこれくらいにしておきます。XQueryを使って検索することで、XMLで保存されたツリー構造のデータが非常に柔軟に扱えることが分かっていただけたでしょうか?

3/3  

 Index
DB基礎講座:XQueryとSQLはどう違う?
 一気に分かる“XQuery”ハンズオン演習
  Page 1
・はじめに
・XMLはどのように保存されるべきか
・SQLとXQueryは何が違うのか
  Page 2
・XQueryの代表的な機能
Page 3
・FLOWR構文を使ったXQuery演習


DB基礎講座:XQueryとSQLはどう違う?


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

注目のテーマ

Database Expert 記事ランキング

本日月間