Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
102
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@nkjm

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

概要

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

利用するサービス

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

apex.oracle.comで無償の開発用Database Cloud環境を取得する

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

元データのダウンロード

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

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

修正・抜粋した日本食品標準成分表

Database Cloudへのインポート

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

まずapex.oracle.comの自分のワークスペースにログインします。
スクリーンショット_2016-12-06_10_58_40.png
login.png

上部のナビゲーションメニューから、SQLワークショップ > ユーティリティ > データ・ワークショップを選択します。
select_data_workshop.png

今回はCSVファイルをインポートしますので、データ・ロードのセクションで、スプレッドシートを選択します。
select_spreadsheet.png

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

  • ロード先:新しい表
  • ロード元:ファイルをアップロード

target_and_method.png

テキスト・ファイルに先ほどダウンロードしたCSVファイルを指定して「次へ」ボタンをクリックします。
file_detail.png

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

  • calorie
  • water
  • protein
  • carb
  • fat
  • fiber
  • ash

table_property.png

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

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

primary key.png

では新しい表が作成され、データがインポートされているか確認します。
ナビゲーションメニューからSQLワークショップ > オブジェクト・ブラウザを選択します。
object_browser.png

左のサイドバーで、新たに作成されているはずのFOODを選択し、さらに「データ」タブを選択してデータが入っていることを確認します。
food_data.png

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

REST APIの作成

ではAPI経由でデータを検索できるようにREST APIを作成します。
ナビゲーションメニューからSQLワークショップ > RESTfulサービスを選択します。
select_RESTful_Service.png

新しいAPIを作るため、作成ボタンをクリックします。
create_restful_module.png

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

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

スクリーンショット 2016-12-06 10.38.32.png

作成されたらテストしてみます。左サイドバーから「GETを選択してください。
click_get.png

画面下部に「テスト」ボタンがあるのでクリックします。
click_test.png

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

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

empty response.png

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

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

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

結果は下記のようになるはずです。
hamberg.png

蛇足ですが、JSONパーサーのようなアドオンをブラウザにインストールしていれば下図のように綺麗に表示できます。
hamberg pretty.png

まとめ

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
102
Help us understand the problem. What are the problem?