食品の栄養価をAPIで取得できるクラウド・データベースを構築する


# 概要

食品名をキーにしてその食品の栄養価を検索できるようなクラウド・サービスがあれば何かと便利です。この記事では最終的にREST APIで検索できる食品栄養価DBを3分ほどで作成してみます。

# 利用するサービス

食品栄養価情報を保存するクラウド・データベースとしてOracle Database Cloudを利用します。今回はその中でも無償で利用できる[apex.oracle.com](https://apex.oracle.com/jp)を利用することします。apex.oracle.comのアカウントをお持ちでない方はすぐに作成できるので下記を参照いただきながら作成してみてください。

[apex.oracle.comで無償の開発用Database Cloud環境を取得する](http://qiita.com/nkjm/items/aaaad9e60a236c7f7d9b)

# 食品栄養価データのダウンロードとインポート

### 元データのダウンロード

元となる食品情報は文部科学省が提供している[日本食品標準成分表 2015年版（七訂）](http://www.mext.go.jp/a_menu/syokuhinseibun/1365297.htm)を利用します。このデータはPDFとExcelファイルとして提供されています。このデータをDatabase Cloudにインポートしてクラウド・サービスとして利用できるようにしようという魂胆です。

オリジナルをダウンロードして見ていただければわかりますが、このデータ、あまり綺麗じゃない（ちゃんと正規化されてない）ので若干修正する必要があります。今回はすでに修正済みの下記のデータをダウンロードして利用します。

[修正・抜粋した日本食品標準成分表](https://dl.dropboxusercontent.com/u/149862/dietitian/%E6%97%A5%E6%9C%AC%E9%A3%9F%E5%93%81%E6%A8%99%E6%BA%96%E6%88%90%E5%88%86%E8%A1%A8.csv)

### Database Cloudへのインポート

データベースは空っぽの状態からはじめます。CSVファイルをインポートすると同時に新しい表を作成し、データをインポートするようにします。

まずapex.oracle.comの自分のワークスペースにログインします。
![スクリーンショット_2016-12-06_10_58_40.png](https://qiita-image-store.s3.amazonaws.com/0/26079/eccd2581-1f57-f3b1-571a-3f165d55c5d1.png "スクリーンショット_2016-12-06_10_58_40.png")
![login.png](https://qiita-image-store.s3.amazonaws.com/0/26079/96c2d691-173e-4dc0-2c82-7045c869a606.png "login.png")

上部のナビゲーションメニューから、SQLワークショップ > ユーティリティ > データ・ワークショップを選択します。
![select_data_workshop.png](https://qiita-image-store.s3.amazonaws.com/0/26079/8b425877-1064-f145-ddff-7628b2f8a14d.png "select_data_workshop.png")

今回はCSVファイルをインポートしますので、データ・ロードのセクションで、スプレッドシートを選択します。
![select_spreadsheet.png](https://qiita-image-store.s3.amazonaws.com/0/26079/e1f92839-848f-0ee9-02bb-bf2d0c59adab.png "select_spreadsheet.png")

下記のようにインポート方法を指定して「次へ」ボタンをクリックします。

- ロード先：**新しい表**
- ロード元：**ファイルをアップロード**

![target_and_method.png](https://qiita-image-store.s3.amazonaws.com/0/26079/e75aa97b-b362-c1bf-c4ec-345a25f78ab0.png "target_and_method.png")

テキスト・ファイルに先ほどダウンロードしたCSVファイルを指定して「次へ」ボタンをクリックします。
![file_detail.png](https://qiita-image-store.s3.amazonaws.com/0/26079/c0c5e3bd-51cc-c5b3-eb17-4ae1107f846c.png "file_detail.png")

次にテーブルの設定です。まず表名を **food** とします。CSVファイルから自動的に列名やデータ型が判定されていますが、もし下記の列でvarchar2になっているものがあれば、すべてnumberに変更してください。

- calorie
- water
- protein
- carb
- fat
- fiber
- ash

![table_property.png](https://qiita-image-store.s3.amazonaws.com/0/26079/619200d6-6bae-5632-875d-7a06217286b3.png "table_property.png")

最後に主キー（プライマリキー）の設定です。今回はfood_idという列が一位な識別子になっているので、これをそのまま主キーとします。下記のように設定して「データロード」ボタンをクリックします。

- 主キーの移入元： **既存の列を使用**
- 主キー： **FOOD_ID**
- 主キー制約名： **FOOD_PK**
- 主キーの移入： **新しい順序から生成**
- 順序： **FOOD_SEQ**

![primary key.png](https://qiita-image-store.s3.amazonaws.com/0/26079/4a8fa442-763a-526b-13e2-af8094ebca3a.png "primary key.png")

では新しい表が作成され、データがインポートされているか確認します。
ナビゲーションメニューからSQLワークショップ > オブジェクト・ブラウザを選択します。
![object_browser.png](https://qiita-image-store.s3.amazonaws.com/0/26079/98814b0a-d774-df79-4854-6e5e94a1c92f.png "object_browser.png")

左のサイドバーで、新たに作成されているはずのFOODを選択し、さらに「データ」タブを選択してデータが入っていることを確認します。
![food_data.png](https://qiita-image-store.s3.amazonaws.com/0/26079/c7c8cb05-bc4e-529d-11c6-bdcde508a56c.png "food_data.png")

これでデータはDatabase Cloudにインポートされました。

# REST APIの作成

ではAPI経由でデータを検索できるようにREST APIを作成します。
ナビゲーションメニューからSQLワークショップ > RESTfulサービスを選択します。
![select_RESTful_Service.png](https://qiita-image-store.s3.amazonaws.com/0/26079/66cbf8e2-4068-0aab-23a6-74683f66af22.png "select_RESTful_Service.png")

新しいAPIを作るため、作成ボタンをクリックします。
![create_restful_module.png](https://qiita-image-store.s3.amazonaws.com/0/26079/1f50e04f-7b0c-dab7-500d-5271f4aab81e.png "create_restful_module.png")

下記のように設定し「モジュールの作成」ボタンをクリックします。

- 名前： **food** *＊このAPIの名前です*
- URIテンプレート： **food/{food_name}** *＊このAPIにアクセスするためのURIを指定します*
- 方法： **GET** *＊このAPIにアクセスするときのHTTPメソッドを指定します*
- ソース・タイプ： **問い合わせ** *＊このAPIにアクセスしたときの処理タイプを指定します*
- 書式： **JSON** *＊このAPIのレスポンスフォーマットです*
- ソース： *＊このAPIにアクセスしたときに実行される処理をSQLで記述します(下記参照)*

```sql:ソース
select * from food where food_name like '%' || :food_name || '%'
```

![スクリーンショット 2016-12-06 10.38.32.png](https://qiita-image-store.s3.amazonaws.com/0/26079/06d52b42-35ad-f480-2f5d-012eb8275798.png "スクリーンショット 2016-12-06 10.38.32.png")

作成されたらテストしてみます。左サイドバーから「GETを選択してください。
![click_get.png](https://qiita-image-store.s3.amazonaws.com/0/26079/68b310ae-6c6f-f3e0-c3a0-9cfa23f896c8.png "click_get.png")

画面下部に「テスト」ボタンがあるのでクリックします。
![click_test.png](https://qiita-image-store.s3.amazonaws.com/0/26079/589dea0a-7814-d69a-893d-44da31c0ebe6.png "click_test.png")

するとブラウザ上で下図のようなJSONデータが表示されるはずです。

> ブラウザによってはこの内容が記載されたテキストファイルをダウンロードする挙動になる場合があります。その場合はそのテキストファイルをエディター等で開いて確認してください。

![empty response.png](https://qiita-image-store.s3.amazonaws.com/0/26079/3e8db212-b0ce-d899-7f21-22d0ca004180.png "empty response.png")

このAPIはURIの末尾に栄養価を取得したい食品名をいれてアクセスしますが、前述のテストボタンをクリックしたそのままだとその末尾が正しくセットされていないので空の配列がレスポンスとして返ってきた状態です。

ということで次は末尾に食品をセットしてみます。例えばハンバーグの栄養価を取得したい場合は下記のようなURIになるでしょう。

```
https://apex.oracle.com/pls/apex/あなたのワークスペース名/food/ハンバーグ
```

結果は下記のようになるはずです。
![hamberg.png](https://qiita-image-store.s3.amazonaws.com/0/26079/3339b0d6-ab42-8c46-0f51-c133b10df7dd.png "hamberg.png")

蛇足ですが、JSONパーサーのようなアドオンをブラウザにインストールしていれば下図のように綺麗に表示できます。
![hamberg pretty.png](https://qiita-image-store.s3.amazonaws.com/0/26079/37d6dc48-56fb-49c7-bd86-20ea7ca3df14.png "hamberg pretty.png")

# まとめ

こんな感じで、現在PDFやExcelでしか配布されていないデータがあれば、Oracle Database Cloudにインポートし、APIをちょこっと設定すればすぐにクラウドサービスとして各種アプリケーションからアクセスできるようになります。