※ 本記事はノート投稿済みの転載です。
※ https://note.com/super_crow2005/n/n350a652b8a1e?magazine_key=m1df32e6ef6e1
RDFには複数の項目を一つのノード要素に関連付けることができる。コンテナモデルと呼ばれている。rdf:Bag、rdf:Seq、rdf:Altの3種類である。纏めの意味に応じた分類であり、書く項目については、その纏めのノードから項目へのノード要素rdf:li(i=1,...)へリンクを張ることになる。
rdf:Bag メンバの順序が意味を持たないコンテナ
rdf:Seq メンバの順序に意味がある場合のコンテナ
rdf:Alt 代替え表現可能な(選択的なメンバ) メンバのコンテナであり、最初のメンバがデフォルト
rdfs:Container RDF でコンテナを意味するクラス
rdfs:member コンテナとメンバを結ぶプロパティ
rdf:1,rdf:2,··· コンテナにある個々のメンバを結ぶ、rdfs:member のサブプロパティ
rdf:li rdf:1,rdf:2,···の略記法
たとえば、
<owl:NamedIndividual rdf:about="http://www.test.org/20250615/test02#mabotofu">
<food:name xml:lang="ja">麻婆豆腐</food:name>
<food:material>
<rdf:Bag>
<rdf:li xml:lang="ja">オイスターソース</rdf:li>
<rdf:li xml:lang="ja">タケノコ</rdf:li>
<rdf:li xml:lang="ja">ピーマン</rdf:li>
<rdf:li xml:lang="ja">片栗粉</rdf:li>
<rdf:li xml:lang="ja">砂糖</rdf:li>
<rdf:li xml:lang="ja">豚肉</rdf:li>
<rdf:li xml:lang="ja">醤油</rdf:li>
</rdf:Bag>
</food:material>
</owl:NamedIndividual>
のように使われる。Bag(集合的に集めたもの)、Seq(順序)、Alt(選択的な集まり)と意味を分けてくれていることはよいのだが、わざわざ階層がついているのが何とも煩わしい。food:material自体に、その要素は単なるあつまりだという解釈ができればいいだけなのだ。すると、次のようにしてよいだろうし、これは文法的に間違っていない。
<owl:NamedIndividual rdf:about="http://www.test.org/20250615/test02#mabotofu">
<food:name xml:lang="ja">麻婆豆腐</food:name>
<food:material xml:lang="ja">オイスターソース</food:material>
<food:material xml:lang="ja">タケノコ</food:material>
<food:material xml:lang="ja">ピーマン</food:material>
<food:material xml:lang="ja">片栗粉</food:material>
<food:material xml:lang="ja">砂糖</food:material>
<food:material xml:lang="ja">豚肉</food:material>
<food:material xml:lang="ja">醤油</food:material>
</owl:NamedIndividual>
もう一つ困ることがあって、後々protégéでOWLファイルを作成するのだが、どうもRDFのコンテナを使えないような感じである。OWLには運用に基づいた3つの言語定義の種類(OWL DL, OWL Lite, OWL Full)があるのだが、RDFの文法を完全に利用できるのはOWL Fullだけのようで、protégéではどうも使えないようなのだ。少なくともRDFの仕様と実装の詳細の詳細を突き合せないとわからないだろう。また、先にみたようにどうも使い勝手も良くない感じだし、わざわざ集合のクラスを定義するなら、もう少し凝った集合の扱いをする場合になるだろう。それならクラスを自分で定義した方がよい。
OWLでのRDF/XMLフォーマットでは、次のようになる。麻婆豆腐が料理(dish)クラスの個物である、というだけである。
<owl:NamedIndividual rdf:about="http://www.test.org/20250615/test02#mabotofu">
<rdf:type rdf:resource="http://www.semanticweb.org/20250615/food#dish"/>
<food:material xml:lang="ja">オイスターソース</food:material>
<food:material xml:lang="ja">タケノコ</food:material>
<food:material xml:lang="ja">ピーマン</food:material>
<food:material xml:lang="ja">片栗粉</food:material>
<food:material xml:lang="ja">砂糖</food:material>
<food:material xml:lang="ja">豚肉</food:material>
<food:material xml:lang="ja">醤油</food:material>
<food:name xml:lang="ja">麻婆豆腐</food:name>
</owl:NamedIndividual>
簡単な記述法では、次のように書けるだろう。
test02:mabotofu rdf:type food:dish,
whose food:material オイスターソース xml:lang ja,
タケノコ xml:lang ja,
ピーマン xml:lang ja.
片栗粉 xml:lang ja,
砂糖 xml:lang ja,
豚肉 xml:lang ja,
醤油 xml:lang ja,
whose food:name 麻婆豆腐 xml:lang ja.
属性の記述に関係詞whoseを使ってみた。
OWLの場合は、クラス(普遍者)公理の定義で、プロパティのコドメインの要素数についての規則を定義できるので、そもそも集合への写像になっているのだ。RDFを設計する段階ではOWLのような記述論理学といった基礎を仮定していないので、必要なことを挙げてコレクションのためのプロパティをつくったのだろう。