MarkLogic ColumnIFやFORを使った構文
はじめに
本稿では、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. 管理者画面(ポート8001番)を開きます。
- 2. 画面左側でDatabaseの「Documents」を選択すると設定項目が展開されます。この中から「Path range indexes」を開いてください。下図は設定画面です。
-
3. 画面上部の「Add」を開くと索引設定画面になります。設定すべき項目を表にしました。「scalar type」をstringにした場合はcollactionを設定しなければいけませんが、今回はデフォルトのままのRoot Collactionとしましょう。
scalar type path expression collaction string /customer/id Root Collation int /customer/birth - - 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では索引を追加することで高速化を図ることができます。