楽天公開レシピデータセットのデータベース変換ツール

目次

概要

  • 楽天株式会社が公開しているレシピデータセットをデータベース形式に変換するための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

実行方法

  1. PHPおよびSQLite3へのパスを通して下さい(バッチファイル内の当該箇所にフルパスを記述しても可).
  2. recipe0x_xxxx_yyyymmdd.txtファイルがある場所に本ツールの全ての構成物を設置し,auto.batを実行して下さい.
  3. 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