Viper 2で学ぶXMLデータベース最新事情
Viper 2で学ぶXMLデータベース最新事情(3)

“プロフ”サイトの構築だってXML DBでしょ


日本アイ・ビー・エム
中林 紀彦
2007/12/21

「XQuery Update Facility」とは?

 さてここまでは具体的な例を紹介しながらXML文書の更新についてお話ししましたが、XML文書の更新については、W3Cから「XQuery Update Facility 1.0」(執筆時点ではワーキング・ドラフト)として公開されています。

 XQuery Update FacilityはXMLのクエリ言語であるXQuery 1.0の拡張で、XML文書を更新するための仕様について述べられています。新しい式として、

  • Insert
  • Delete
  • Replace
  • Rename
  • Transform

が定義されています。

 DB2 9.5はXQuery Update Facilityの仕様(W3C Working Draft 11 July 2006)に基づいて、Transform(変換)式を中心とした実装になっています。このTransform式は、実際のXMLノードのコピーを作成して、そのコピーに対しての変更操作(Insert、Delete、Replace、Rename)を行うというものです。また、「3. プロフィール項目の追加」の部分で解説したように、実際のXML文書の更新にはUPDATE文を使います。

 XQuery Update Facility 1.0にはこれ以外にも、更新のための関数やルーチンについて書かれていますので、興味のある方は目を通してみてください。日本語の翻訳はまだないようですが、式や関数の構文を中心に書かれていますので、英語の苦手な方でも理解できる内容になっています。

XMLデータベースならではのひと味もふた味も違う機能

 今回は、XMLデータの更新というテーマを中心にお話しましたので、検索についてはあまり触れていませんが、検索についてもXQueryで十分に既存サービスを上回る機能を満たせます。下記の不満点をXQueryで解消してみましょう。

  • ヒットした項目名を表示できるものはない
  • 検索項目と項目の内容を指定できるものがない

 リスト8-1はヒットしたXMLデータのHNとヒットした項目自体も返すようになっています。既存サービスで、キーワード検索でヒットした結果にどの項目でヒットしたのかを表示するものは、調べた限りではありませんでした。

xquery
declare default element namespace "http://myprof.com";
for $i in db2-fn:xmlcolumn("PROFXMLATT.PROFXML")
where $i/prof[項目 = "竹内結子"]
return
<prof>{
  $i/prof/項目[@項目名 = "HN"],
  for $c in $i/prof/項目
  where $c = "竹内結子"
  return $c
}</prof>
リスト8-1 ヒット結果にヒット項目名も表示

 リスト8-2は項目名を複数指定して検索をするという、XQueryとしては非常に初歩的なものです。しかし、これをMySQLのようなリレーショナル・データベースでSQLを書くと、自己結合が検索項目の数だけ発生してしまうので、データ量が多くなると非常にパフォーマンスが悪くなってしまいます。

xquery
declare default element namespace "http://myprof.com";
for $i in db2-fn:xmlcolumn("PROFXMLATT.PROFXML") 
where $i/prof/項目[@項目名 = "趣味"] = "お笑いを見る"
and $i/prof/項目[@項目名 = "星座"] = "ふたご座"
and $i/prof/項目[@項目名 = "好きな食べ物"] = "味噌カツ"
return $i
リスト8-2 複数の項目名を指定して検索

 リスト8-3は集計を行うXQueryで、検索キーワードでヒットした項目を集計するものです。例えば、「カレー」というキーワードで検索したとすると、ヒットした項目が「好きな食べ物」なのか「嫌いな食べ物」なのか、もしくは職業やアルバイト(カレー屋さん)なのか、その件数を結果として返します。このような検索も既存のサービスで実装できているところはないようです。

xquery
declare default element namespace "http://myprof.com";
<result>{
  for $o in distinct-values(
    for $i in
      db2-fn:xmlcolumn("PROFXMLATT.PROFXML")/prof[項目 = "カレー"]/..
    return 
      for $c in $i/prof/項目
      where $c = "カレー"
      return xs:string($c/@項目名)
  )
  let $name := (
    for $n in
      db2-fn:xmlcolumn("PROFXMLATT.PROFXML")/prof/項目[@項目名 = $o
        and . = "竹内結子"]/..
    return $n
  )
  return <item>
    <項目名>{$o}</項目名>
    <ヒット数>{fn:count($name)}</ヒット数>
  </item>
}</result>
リスト8-3 ヒット項目の集計

 今回のKさんは、XMLデータベースに目覚めました。プロフのような属性の項目数が多く、各データの持つ項目数が一致していない場合、MySQLなどのリレーショナル・データベースでアプリケーションを構築するには限界があります。今回のようにXMLデータベースを使うことで、いままではシステムの限界のように思えていたことも、いとも簡単にできてしまいます。このような例は商品カタログや求人のレジュメ、社員のスキル情報などさまざまなケースに応用が可能ですので、これを機会に人とモノの属性に関する情報を扱う際には、ぜひXMLデータベースを検討してください。

  4/4  

 Index
連載:Viper 2で学ぶXMLデータベース最新事情(3)
 “プロフ”サイトの構築だってXML DBでしょ
  Page 1
・どのサービスよりも高機能で柔軟な“プロフ”サイト
  Page 2
・プロフサービスの基本となる機能の実装
 1. XMLデータの登録
 2. 対象データの検索
 3. プロフィール項目の追加
  Page 3
 4. プロフィール項目の変更
 5. プロフィール項目の削除
 6. 複数のプロフィール項目を同時に変更
 7. プロフィール項目の順序を変更する
Page 4
・「XQuery Update Facility」とは?
・XMLデータベースならではのひと味もふた味も違う機能


Viper 2で学ぶXMLデータベース最新事情



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

注目のテーマ

Database Expert 記事ランキング

本日月間