(3)食材を使った料理レシピの検索
前回は料理レシピで使う食材を、材料一覧にある個々の材料項目と食材オントロジーにある食材とのトリプルを利用して検索したのだった。そのトリプルとは、
recp:材料項目 recp:ref_mat fmat:食材 .
である。そもそも、食材を使った料理レシピを知りたいのであった。したがって、料理レシピと材料項目との関係がわからないとならない。そこで料理レシピのオントロジーを調べることになる。
まず料理レシピは、材料一覧を持っているのだった。
recp:料理レシピ recp:has recp:材料一覧 .
そして、材料一覧は、任意個の材料項目と材料グループを持つのだ。持たなくてもよい。つまり0個以上の材料項目と材料グループと関係があるということだ。
recp:材料一覧 recp:has recp:材料項目.
recp:材料一覧 recp:has recp:材料グループ.
また、材料グループは、任意個の材料項目と材料グループを持つのだ。材料グループは再帰的に設定できるのだった。
例として、食材をサラダ油として、サラダ油を使用する料理レシピを検索することを考えよう。
とりあえず、材料グループを無視して、料理レシピと食材をトリプルでつなぐことを考えると次のようなSPARQLクエリーになるだろう。ファイル名はt03.rqとする。
# サラダ油を使った料理レシピ
# sparql --data=cookpad_moritosh.ttl --query=t03.rq
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX fmat: <http://www.onto.org/life/food/material#>
PREFIX recp: <http://www.onto.org/life/food/recipe#>
PREFIX mtsh: <http://www.onto.org/life/food/cookpad_moritosh/>
SELECT ?v
WHERE
{
?v recp:has ?u.
?v rdf:type recp:レシピ.
?u rdf:type recp:材料一覧.
?u recp:has ?t.
?t recp:ref_mat fmat:サラダ油.
}
ORDER BY ?v
> sparql --data=cookpad_moritosh.ttl --query=t03.rq
とすると、次の結果を得る。
-------------------------
| v |
=========================
| mtsh:サイコロステーキのパスタ_レシピ |
-------------------------
これはこれで正しい結果である。次に材料グループを反映してみよう。この場合、料理レシピと食材の関連は
料理レシピ―材料一覧―料理グループ―料理グループ―・・・
・・・―料理グループ―材料項目―食材
と、料理グループと料理グループのつながりがいくらでも長くなり得る。つまり、料理グループ―料理グループの繋がりはいくらでも存在し得るのである。
もっとも短い場合は、
料理レシピ―材料一覧―料理グループ―材料項目―食材
である。このとき、料理グループ―料理グループの繋がりは0個である。この0個以上、無限に繋がり得る再帰構造をトリプルで表現するにはアスタリスク(*)を使う。次のように書けばよい。
# サラダ油を使った料理レシピ
# sparql --data=cookpad_moritosh.ttl --query=t03.rq
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX fmat: <http://www.onto.org/life/food/material#>
PREFIX recp: <http://www.onto.org/life/food/recipe#>
PREFIX mtsh: <http://www.onto.org/life/food/cookpad_moritosh/>
SELECT ?v
WHERE
{
?v recp:has ?u.
?v rdf:type recp:レシピ.
?u recp:has ?t.
?u rdf:type recp:材料一覧.
?t rdf:type recp:材料グループ.
?s rdf:type recp:材料グループ.
?t recp:has* ?s.
?s recp:has ?r.
?r recp:ref_mat fmat:サラダ油.
}
ORDER BY ?v
?t recp:has* ?s. と述語recp:hasにアスタリスク(*)を付ける。また、?tと?sは recp:材料グループ というクラスだとrdf:typeで明らかにしている。これにより0個以上、無限までの材料グループ―材料グループの連鎖を表現しているのだ。
結果は次となる。
----------------------
| v |
======================
| mtsh:パスタ麺の皿うどん_レシピ |
----------------------
これも正しい。mtsh:サイコロステーキのパスタ_レシピとパスタ麺の皿うどん_レシピはサラダ油を使ったレシピなのだ。ということは、どちらもまとめて検索する問い合わせが、「サラダ油をつかう料理レシピを検索する」問い合わせなのだ。これには、上の2つの方法で得る結果の和集合を取ればよい。すなわち和集合をとるのだ。SPARQLではUNIONを用いる。次が求めるクエリーである。
# サラダ油を使った料理レシピ
# sparql --data=cookpad_moritosh.ttl --query=t03.rq
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX fmat: <http://www.onto.org/life/food/material#>
PREFIX recp: <http://www.onto.org/life/food/recipe#>
PREFIX mtsh: <http://www.onto.org/life/food/cookpad_moritosh/>
SELECT ?v
WHERE
{
{
?v recp:has ?u.
?v rdf:type recp:レシピ.
?u rdf:type recp:材料一覧.
?u recp:has ?t.
?t recp:ref_mat fmat:サラダ油.
}
UNION
{
?v recp:has ?u.
?v rdf:type recp:レシピ.
?u recp:has ?t.
?u rdf:type recp:材料一覧.
?t rdf:type recp:材料グループ.
?s rdf:type recp:材料グループ.
?t recp:has* ?s.
?s recp:has ?r.
?r recp:ref_mat fmat:サラダ油.
}
}
ORDER BY ?v
結果は次となる。
-------------------------
| v |
=========================
| mtsh:サイコロステーキのパスタ_レシピ |
| mtsh:パスタ麺の皿うどん_レシピ |
-------------------------
もう一つ例として、今度は「しょうゆ」と「しょうゆダレ」を使った料理レシピを検索してみよう。もちろんスキーマ(トリプルのつながりの事と考えてよいだろう)は同じで、違いは「しょうゆ」と「しょうゆダレ」で集合の和をとらなければならないということである。
次のようにすればよい。ファイル名はt04.rqとする。
# しょうゆを使った料理レシピ
# sparql --data=cookpad_moritosh.ttl --query=t04.rq
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX fmat: <http://www.onto.org/life/food/material#>
PREFIX recp: <http://www.onto.org/life/food/recipe#>
PREFIX mtsh: <http://www.onto.org/life/food/cookpad_moritosh/>
SELECT ?v ?r ?tt
WHERE
{
{
?v recp:has ?u.
?v rdf:type recp:レシピ.
?u recp:has ?t.
?u rdf:type recp:材料一覧.
?s rdf:type recp:材料グループ.
?t rdf:type recp:材料グループ.
?t recp:has* ?s.
?s recp:has ?r.
?r rdf:type recp:材料項目.
{
?r recp:ref_mat fmat:しょうゆ.
} UNION {
?r recp:ref_mat fmat:しょうゆダレ.
}
}
UNION
{
?v recp:has ?u.
?v rdf:type recp:レシピ.
?u rdf:type recp:材料一覧.
?u recp:has ?tt.
?tt rdf:type recp:材料項目.
{
?tt recp:ref_mat fmat:しょうゆ.
} UNION {
?tt recp:ref_mat fmat:しょうゆダレ.
}
}
}
ORDER BY ?v
結果は次となる。
--------------------------------------------------------------------------------
| v | r | tt |
================================================================================
| mtsh:カレー南蛮_レシピ | mtsh:カレー南蛮_カレー餡_しょうゆ | |
| mtsh:カレー南蛮_レシピ | mtsh:カレー南蛮_出汁_しょうゆダレ | |
| mtsh:チキン照り焼きサンド大_レシピ | mtsh:チキン照り焼きサンド大_鶏照り焼き_しょうゆダレ | |
| mtsh:煮豚_レシピ | | mtsh:煮豚_しょうゆ |
| mtsh:煮豚_レシピ | | mtsh:煮豚_しょうゆダレ |
| mtsh:玄米ご飯ひき肉_レシピ | | mtsh:玄米ご飯ひき肉_しょうゆダレ |
| mtsh:秋刀魚(サンマ)刺身丼_レシピ | | mtsh:秋刀魚(サンマ)刺身丼_しょうゆ |
| mtsh:肉うどん_レシピ | | mtsh:肉うどん_しょうゆダレ |
| mtsh:肉うどん_レシピ | mtsh:肉うどん_具_しょうゆダレ | |
| mtsh:鶏飯_レシピ | | mtsh:鶏飯_しょうゆ |
--------------------------------------------------------------------------------