MarkLogicでRaspberryPi3のセンサー情報を取り込んでみよう（1）MarkLogic9のインストール～DB構築まで

この記事は[MarkLogic Advent Calendar 2017](https://qiita.com/advent-calendar/2017/marklogic)の2日目です。

#はじめに
いよいよ12月となりまして、[JucoML](https://qiita.com/JucoML)が主催する[MarkLogic Advent Calendar 2017](https://qiita.com/advent-calendar/2017/marklogic)に参加することにしました。クリスマスまでよろしくお願いします（既に12月1日分を投稿済みですが・・・）。

MarkLogicといえばスキーマレスのXML/JSON DBですが、魅力的なのはそれだけではなく、多くの機能を搭載しています。MarkLogicの魅力をお伝えしたいと思います。

#なにをやろう
で、テーマをどうするか悩みましたが、ちょうど年末年始に遊ぼうと思っていたRaspberry Pi3や各種センサー類が手元にありますので、これとMarkLogicを連携して何か面白いことをやってみようと思います。

取りあえずは以下のようなことを徐々に投稿していきます。

1. MarkLogic9のインストール
2. node.jsとの連携
3. MQTTでMarkLogicにアクセスしてみる
4. RaspberryPi3のセンサー情報をMQTTで連携してみる

#今回やること
まずはMarkLogic環境を構築するところから始めます。そして今回の一連の記事で使用するデータベースを構築するところまで実施します。

#環境
以下の環境を使用します。

| 環境 | バージョン等 |
| --- | --- |
| CentOS7 | 7.4.1708 |
| MarkLogic9 | 9.0-3 |

#注意事項
MarkLogicは商用DBです。商用利用する際にはライセンスの購入が必要になります。
開発目的や今回のような実験目的であれば、無料の開発者ライセンスが使用可能です。

MarkLogicの開発者ライセンスの詳細は以下をご確認下さい。
http://developer.marklogic.com/free-developer

#事前準備
MarkLogicのインストールや設定・管理を行うためには、WebブラウザでMarkLogicに接続する必要があり、ポート番号8001番や8000番を使用します。
CentOS7の場合、firewalldの設定でこれらのポートへのアクセスを許可するか、firewalldを無効化しておいて下さい。

#まずはMarkLogic9のインストール
CentOS7にMarkLogic9をインストールします。MarkLogic9は[この辺り](http://developer.marklogic.com/products)からRPMを入手出来ます。

以下でインストールを実行します。

```
# yum install MarkLogic-9.0-3.1.x86_64.rpm -y
```

インストールが完了したら起動します。

```
# systemctl start MarkLogic.service
```

# MarkLogicのセットアップとデータベース作成
## 初期設定
インストールと起動が完了したら、MarkLogicの初期設定を行います。
初期設定については、JucoMLの[この記事](https://qiita.com/JucoML/items/16ac9923324d3485f4d7)が参考になります。こちら記事はMarkLogic8ですが、MarkLogic9も同様の手順で設定出来ます。

## データベースの作成
初期設定の完了後、今回使用するデータベースを作成します。
Webブラウザで8001番にアクセスし、管理画面を表示します。

データベースを作成するには、管理画面の左ペインから「Databases」をクリックします。次に右ペインの「Create」タブをクリックします。

![pic01_ml9_db_create_sml.png](https://qiita-image-store.s3.amazonaws.com/0/187299/402afcb9-b970-fdb4-790c-f6fc210f1039.png)

この画面で必要事項を入力するとデータベースが作成されます。

今回は以下のように設定しました。それ以外は初期値にしておきます。

| 項目名 | 設定値 |
| --- | --- |
| database name | IoTDatabase |
| language | ja |

入力を終えたら、画面の「ok」ボタンを押します。
すると、「This database has no forests, select  Database->Forests to attach a forest.」と警告されます。

![pic02_ml9_db_create_no-forests.png](https://qiita-image-store.s3.amazonaws.com/0/187299/1f5e5e71-7ae0-4f3a-f3f0-d1d38593985d.png)

MarkLogicのデータベース情報は「フォレスト」と呼ばれるファイル群に保存されています。Oracleで例えるなら「データファイル」のようなものでしょうか。
データベースを作成しようとしても、このフォレストが存在しないため警告されました。

## フォレストの作成
続いてフォレストを作成します。警告文中の「Database->Forests」リンクを押下すると、フォレストの作成を行えます。

![pic03_ml9_db_create_forest_1.png](https://qiita-image-store.s3.amazonaws.com/0/187299/9ed32763-54ab-dcc7-f41a-86a89f5d829a.png)

「Create a Forest」を押下します。

![pic03_ml9_db_create_forest_2.png](https://qiita-image-store.s3.amazonaws.com/0/187299/2cb131bc-e6e2-d44a-0682-b565cde5ba40.png)

上記画面で必要事項を入力して「ok」を押下するとフォレストが作成されます。
「forest name」に「IoTDatabaseForest01」と入力し、それ以外は初期値としました。

フォレストを作成したら、先ほど作成したデータベースに紐付けます。
画面の右ペインの「Summary」タブをクリックすると、現在存在するフォレストの一覧が表示されます。

![pic03_ml9_db_create_forest_3.png](https://qiita-image-store.s3.amazonaws.com/0/187299/404dcaac-ce3f-23c8-0ff3-5be329e6d3b9.png)

この中から先ほど作成したフォレスト「IoTDatabaseForest01」を探し、「Databases」列のドロップダウンから紐付けるデータベースを選択します。そして「ok」ボタンを押下するとデータベースにフォレストが紐付き、データベースを使用できるようになります。

#データを登録してみる
作成したデータベースを使用出来るか確認してみます。

今回はQueryConsoleを使用します。Webブラウザ上でXQueryやJavascriptを実行できます。
Webブラウザを起動し、当該サーバの8000番ポートにアクセスしてログインします。

![pic04_ml9_query-console_1.png](https://qiita-image-store.s3.amazonaws.com/0/187299/6ce0a178-498c-b3b0-8664-999e6c2696cc.png)

画面右上のドロップダウン「Database」で「IoTDatabase」を選択します。
その右隣の「Query Type:」で「XQuery」を選択します。

そして、以下のクエリを実行してXMLファイルを作成してみます。
クエリをテキストエリアに入力し、「Run」を押下すると実行されます。
ちなみに、「ALT+Enter」でも実行可能です。

```
xdmp:document-insert("/helloworld.xml", <message>Hello, World</message>)
```

![pic04_ml9_query-console_2.png](https://qiita-image-store.s3.amazonaws.com/0/187299/a8c1f6ec-5a38-80ff-7489-8aaa06892c81.png)

これでドキュメントが作成されたはずです。確認してみます。

```
fn:doc("/helloworld.xml")
```

![pic04_ml9_query-console_3.png](https://qiita-image-store.s3.amazonaws.com/0/187299/107229b3-aba4-ce4b-e906-564a8f6554fd.png)

登録したドキュメントの内容が表示されれば成功です。

#おしまい
MarkLogicはインストールからDB構築まで非常に簡単に実施できる商用DBです。
初期設定のままでも十分使用可能な状態となっています。

#次回予告
次はnode.jsを導入し、MarkLogicと接続してみようと思います。