目次
概要
- 楽天株式会社が公開しているレシピデータセットをデータベース形式に変換するためのWindows用ツールです.
- 2016年1月12日版,2012年7月5日版いずれにも対応しています.
- SQLiteを対象としていますが,本ツールで作成される中間ファイル(データベースへのインポート用テキストファイル)の形式をテキストエディタで微修正すれば,MySQL等その他のデータベースにも対応可能です.
- こちらで公開されているものとは別物です.
ダウンロード
構成物
- data_converter.php: 楽天公開レシピデータセットを元に,SQLiteデータベースへのインポート用データファイル群を生成するプログラム
- create_database.sql: SQLiteデータベースの作成コマンド(簡素なレシピテーブルのみ)
- create_database_full.sql: SQLiteデータベースの作成コマンド(全テーブル)
- auto.bat: data_converter.phpを実行した後にSQLiteへのデータインポートを実行するバッチファイル
- README.html: 本ファイル
データベーススキーマ
momentsテーブル
- どんな時用ID: id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
- どんな時用: moment TEXT NOT NULL
costsテーブル
- 費用の目安ID: id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
- 費用の目安: cost TEXT NOT NULL
timesテーブル
- 調理時間の目安ID: id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
- 調理時間の目安: time TEXT NOT NULL
tsukureposテーブル
- つくレポID: id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
- レシピID: recipe_id INTEGER DEFAULT NULL
- ユーザID: user_id INTEGER DEFAULT NULL
- おすすめコメント: report TEXT NOT NULL
- オーナーコメント: reply TEXT NOT NULL
- 投稿日: report_date DATE DEFAULT NULL
materialsテーブル
- レシピID: recipe_id INTEGER NOT NULL
- タイトル: title TEXT NOT NULL
- 分量: title TEXT DEFAULT NULL
stepsテーブル
- レシピID: recipe_id INTEGER NOT NULL
- 番号: no INTEGER NOT NULL
- 手順: content TEXT DEFAULT NULL
recipesテーブル
- レシピID:id INTEGER PRIMARY KEY NOT NULL
- ユーザID: user_id INTEGER DEFAULT NULL
- 大カテゴリ: category1 INTEGER DEFAULT NULL
- 中カテゴリ: category2 INTEGER DEFAULT NULL
- 小カテゴリ: category3 INTEGER DEFAULT NULL
- 表示用タイトル: display_title TEXT NOT NULL
- 料理名: title TEXT NOT NULL
- きっかけ: motivation TEXT DEFAULT NULL
- 紹介文: comment TEXT DEFAULT NULL
- 料理画像ファイル名: image_path TEXT DEFAULT NULL
- タグ: tag1 ~ tag4 INTEGER DEFAULT NULL
- ワンポイント情報: know_how TEXT DEFAULT NULL
- 調理時間の目安ID: time_id INTEGER DEFAULT NULL
- どんな時用ID: moment_id TEXT DEFAULT NULL
- 費用の目安ID: cost_id TEXT DEFAULT NULL
- 何人分: serves TEXT DEFAULT NULL
- レシピ公開日: report_date DATE DEFAULT NULL
動作環境
Windows 7以降
- 32bit/64bitどちらでも動作するはずです.
- Linux/Mac OSでもdata_converter.php自体はLinux環境でも動作するはずです(auto.batをBash等に書き換えましょう).
PHP 5.5.15以降
- 32bit/64bitどちらでも動作するはずです.
- 最新版はこちらから: http://windows.php.net/download/
- (2016年1月16日現在: 『VC11 x86 Thread Safe (2016-Jan-06 23:36:02)』→『Zip』[[20.32MB])
SQLite 3.10.1
- 極力同じバージョンをご使用下さい.
- 最新版はこちらから: http://www.sqlite.org/download.html
- (2016年1月16日現在: 『Precompiled Binaries for Windows』→『sqlite-shell-win32-x86-3100100.zip』(366.06 KiB)
楽天レシピデータ 2016年1月12日版
- 2012年7月5日版でも動作します.
- 参考: http://rit.rakuten.co.jp/opendataj.html
実行方法
- PHPおよびSQLite3へのパスを通して下さい(バッチファイル内の当該箇所にフルパスを記述しても可).
- recipe0x_xxxx_yyyymmdd.txtファイルがある場所に本ツールの全ての構成物を設置し,auto.batを実行して下さい.
- rakuten_recipe.db(約700MB)とrakuten_recipe_full.db(約1GB)が作成されていれば成功です.
- テスト環境(Windows 10,Core i7-6700K @4.0GHz,32GB,SSD)では数分で実行完了します.
- rakuten_recipe_full.dbには,全てのテーブルが含まれます.
- rakuten_recipe.dbには,materials,steps,recipes(id/display_title/title/image_pathカラム)テーブルのみ含まれます.
- auto.bat実行後に生成される*.datファイルはSQLiteデータベースへのインポート用データファイルです(不要なら削除可).
- 楽天レシピデータセット内の全ての「"」は「\"」に置換されます.
- 各テーブルのインデクスを作成したい場合は,*.sqlファイルの末尾にコメントアウトされているCREATE INDEXコマンドを参考にしてください.
チュートリアル
データの検索
- データベースから特定のレコード群を抽出するにはWHERE句を使用したSQL文を発行します.
-
例えば,料理名に「ハンバーグ」を含むレシピデータを抽出するには下記を実行します.
sqlite> SELECT * FROM recipes WHERE title LIKE '%ハンバーグ%';
データの件数計算
-
料理名に「ハンバーグ」を含むレシピデータの件数を調べたい場合は下記を実行します.
sqlite> SELECT count(*) FROM recipes WHERE title LIKE '%ハンバーグ%';
複数テーブルからのデータ検索(その1)
- データベース内の複数のテーブルを結合して特定カラムのみのレコード群を抽出する場合はINNER JOIN句またはLEFT OUTER JOIN句を使用したSQL文を発行します.
- 例えば,recipesとtsukureposの両テーブルを結合して,レシピID,表示用タイトル,つくレポおすすめコメント,つくレポオーナーコメントをタブ区切りで抽出するには下記を実行します.
sqlite> .separator \t sqlite> SELECT recipes.id, recipes.display_title, tsukurepos.report, tsukurepos.reply FROM recipes INNER JOIN tsukurepos ON recipes.id = tsukurepos.recipe_id;
- ※ つくレポが存在するレシピのみ抽出されます.
- ※ 全てのレシピを抽出したい場合は,INNER JOINをLEFT JOINに変えてください.
複数テーブルからのデータ検索(その2)
- LEFT JOIN句とサブクエリ(副問い合わせ)の組み合わせにより,より複雑なデータ抽出が可能です.
- 例えば,レシピ毎にrecipesテーブルの全カラムに加えて,各レシピに対応するmaterialsテーブルの材料・分量とstepsテーブルの手順を1行にまとめて取得するには下記を実行します.
sqlite> .separator \t sqlite> .headers on sqlite> SELECT r.*, m.ingredients, m.volumes, s.steps ...> FROM recipes r ...> LEFT JOIN ( SELECT materials.recipe_id, group_concat(materials.title,'<>') AS ingredients, group_concat(materials.volume,'<>') AS volumes FROM materials GROUP BY materials.recipe_id ) m ON r.id = m.recipe_id ...> LEFT JOIN ( SELECT steps.recipe_id, group_concat(steps.content,'<>') AS steps FROM steps GROUP BY steps.recipe_id ) s ON r.id = s.recipe_id;
- ※ group_concat関数の第二引数により材料/分量/手順間のセパレータを指定できます.
検索結果のファイル出力
-
出力結果をファイル(例:output.txt)に保存する場合は,SQL文を記述したテキストファイル(例:sample.sql)を文字コードUTF-8で作成して,下記を実行します.
sqlite3 rakuten_recipe.db < sample.sql > output.txt
更新履歴
- 2016/01/16: Ver. 2.0
- 楽天レシピデータセットのオリジナルのデータ構造に沿うようにデータベースのスキーマを変更
- メモリ使用量を抑えるようにプログラムを修正
- 2014/08/14: Ver. 1.2
- データインポート後に空文字をNULL値に変換するようにした
- データベースのスキーマを変更
- 2014/08/11: Ver. 1.1
- 一部のレシピで材料または素材が抜けていたのを修正
- 2014/08/09: Ver. 1.0
- 公開
注意事項
- 個人利用の範囲で本ツールを改変しても構いませんが,二次配布は禁じます.
- 本ツールの利用により発生したいかなる損害に対しても,作者は一切の責任を負いません.
-
質問等は下記までお願いします.
- 中京大学 道満 恵介
- kdoman[at]sist.chukyo-u.ac.jp