ちょっとしたメモ

階層キーワードとシソーラス定義

ウェブログや日記にキーワードをつけるのは広く行われているが、どうせならSemantic Bloggingのような階層アプローチがいいなと思って、試しに小さな独自シソーラスを定義してみた。こうすることで、FOAFという特定のジャンルでも、メタデータという大きな括りでも、記事を検索することが可能になる。

シソーラスの定義には、RDF Vocabularies for ThesauriのSKOS-Coreを用いた。クラス(Concept)をより定義の広い概念に結びつけるプロパティskos:broaderを始め、skos:narrowerskos:relatedなどを使ってシンプルなシソーラスを容易に構築できるものだ(キーワードにWordnetのような既存シソーラスの利用を提案すると、その世界観に絡め取られるような気がするのか、かなり抵抗されることがあるのだが、こうやって自前のシソーラスをつくれば、そういう問題もない)。必要に応じて、RDF版WordnetにsubClassOfで関係づけておけば、ある程度の意味の共有も可能だろう。

(例)

<skos:Concept rdf:ID="foaf">
 <rdfs:label>FOAF</rdfs:label>
 <rdfs:comment>FOAF - Friend of a Friend Vocabulary</rdfs:comment>
 <skos:broader rdf:resource="#metadata"/>
</skos:Concept>

少々迷ったのが、クラスの名前付けだ。シソーラスの場合、各キーワード名やクラスのURIもその階層構造に合わせて決めるのが分かりやすそうに思える。たとえばSemantic Bloggingでは、階層を直接キーワードの名前に反映させている。

(例)

/technologies/
/technologies/blogging/
/technologies/blogging/communities/
/technologies/blogging/trackback/

キーワードに対しては、最後の例なら次のようにしてURIを対応させて、RDFでシソーラスを定義している。

http://jena.hpl.hp.com/topic/technologies/blogging/trackback/

この方法の難点は、XMLの名前に'/'を含むことはできないので、(最後の/はないとしても)/technologies/blogging/trackbackをクラス名とすることができないところ。従って、このクラスURIを名前空間 + ローカル名という形で書くと次のようになってしまう。

(例)

http://jena.hpl.hp.com/topic/technologies/blogging/ + trackback
http://jena.hpl.hp.com/topic/technologies/ + blogging

RDFでこれらのキーワードをQNameとして表現しようとした場合、trackbackbloggingは別の名前空間URIが必要になるわけだ。これはいまひとつ使い勝手が悪い。

クラスの階層を名前に持ち込まないというのもひとつの考え方だ。上の例ならば、URIをhttp://jena.hpl.hp.com/topic/trackbackという具合にしておけば、名前空間はボキャブラリ全体でhttp://jena.hpl.hp.com/topic/ひとつで済むことになる。もっともこの場合は、同じ名前をツリーの異なる場所で使うことはできなくなる。たとえば、bookを「読んだ本」と「自分で書き著す本」とで使い分けるといった階層キーワードのメリットは生かせない。

あれやこれや考えた結果、このメモ帖キーワードでは、ピリオド「.」を使って階層を区切ったクラス名を用いることにした。たとえばFOAFならweb.meta.foafというもので、「webカテゴリーのmetaカテゴリーに属するfoaf」であることを示している。上位カテゴリーのweb.metaで検索すれば、web.meta.foafweb.meta.rssも引っかかるという仕掛けだ。

階層が名前に含まれていると、階層カテゴリー検索の実装が簡単というメリットもある。ただし、こうした名前は、あとで階層構造を変更しようとすると大変なことになるので、名前の重複の可能性がなく、設計の柔軟性を残しておきたいなら、クラス名は階層を含まないものにしておく方が賢明かも知れない。

関連メモ:
genre: meta. at