05

MarkLogic ColumnIFやFORを使った構文

MLについて
馬場 雅大

はじめに

本稿では、MarkLogicなどのXMLデータベースに用いられるXQueryの条件分岐に用いるif/else文や基本構文「FLOWR構文」を説明します。

if/elseによる条件分岐

他の一般的なプログラミング言語と同様にXQueryでも条件分岐はif/elseを用います。if/else内の条件には、等号・不等号やブール値を設定することができます。elseは省略できません。変数$birthと2000を比較して文字列を返すサンプルクエリを示します。

XQueryにはswitchもあります。同じ動作のサンプルクエリを示します。

この中で使われているlet句やreturn句については次のFLOWR構文の中で紹介します。

FLOWR構文

XQueryを記述するにあたり必要となる5つの構文です。5つの頭文字をとってFLOWRと称します。まずは一覧を示しましょう。

構文 説明
for 繰り返し処理を規定する。
at句:1からの順番数字の変数を設定することができる。省略可能である。
in句:ループするシーケンス変数。(11 to 20)といったように1つずつ増える数字を設定することもできる。
let 変数に値を割り当てる。
order by FLOWR構文の結果をソートする。デフォルトでは昇順(ascending)となるが、降順としたいときは末尾にdescendingと記述する。省略可能である。
where FLOWR構文での処理対象を等号・不等号などを用いて選別する。省略可能である。
return FLOWR構文の結果を規定する。いわゆる戻り値を設定する。

FLOWR文を使った例文

5つの構文全てを使ったXQueryの例文を見てみましょう。「顧客データを参照して2000年以降の顧客データをid要素でソートして返す」という想定です。クエリコンソールのDatabaseをデフォルトで存在する「Documents」、Query Typeを「XQuery」として中部のテキストフィールドにそれぞれ貼り付けて実行します。

まずは3件の顧客データを挿入します。それぞれ誕生年を2001年・2000年・1999年とします。

いよいよ検索クエリです。戻り値をカンマで文字列連結するため、fn:string-join関数を用いています。

検索結果で2000年と2001年のデータが出ていれば検索成功です。

余裕があれば、where文やorder by文の内容を変更して戻り値がどのように変わるか確認してみて下さい。

FLOWR文の課題とMarkLogicの対応

ここまでFLOWR文を説明してきました。ところで、クエリ上に検索したデータを展開してwhere句による選別やorder by句によるソートを行うと、データ規模によってはforループの負荷が重たくなって時間がかかる可能性があります。これに対してMarkLogicでは索引追加・クエリ修正によって高速化を図ることができます。

ここではwhere句条件のbirth要素とorder by句条件のid要素にPath range indexという索引を設定することによる改善を紹介します。Path range indexとはXPathで指定した範囲を対象とした索引です。以下にPath range indexの設定手順を示します。

  1. 1. 管理者画面(ポート8001番)を開きます。
  2. 2. 画面左側でDatabaseの「Documents」を選択すると設定項目が展開されます。この中から「Path range indexes」を開いてください。下図は設定画面です。
  3. 3. 画面上部の「Add」を開くと索引設定画面になります。設定すべき項目を表にしました。「scalar type」をstringにした場合はcollactionを設定しなければいけませんが、今回はデフォルトのままのRoot Collactionとしましょう。
    scalar type path expression collaction
    string /customer/id Root Collation
    int /customer/birth -
  4. 4. OKボタンを押せば完了です。リインデックスと呼ばれる索引の再作成が開始されます。データベース内のデータが少量であれば、リインデックスはすぐに完了します。下図は設定後の「Path range indexes」画面です。

Path range index設定後のクエリチューニング例を示します。ここではfor句内からwhere句・order by句を削除することができました。今回のデータでは、for句のループは生年が2000年以降の2データのみとなり、order by句によるクエリ内でのソートは不要となっています。

まとめ

本稿の内容をまとめます。

  • XQueryはMarkLogicをはじめとしたXMLデータベースに対するクエリとして用いられます。
  • XQueryは条件分岐にif/elseを用います。elseは省略できません。
  • XQueryには、FLWORと呼ばれる基本構文があります。FLOWRとは、「forによる繰り返し」・「letによる代入」・「order byによるソート」・「whereによる選別」・「returnによる戻り値設定」の総称です。
  • FLOWR構文のうち、where句とorder by句はクエリ処理が重たくなる可能性があります。MarkLogicでは索引を追加することで高速化を図ることができます。

Contact

本取組みに関するお問い合わせは
下記までご連絡ください。
株式会社NTTデータ
第一金融事業本部
 金融グローバルITサービス事業部 
ABLER推進担当