ちょっとしたメモ

RDF/XML構文のお勉強 - parseTypeとプロパティ属性

まだ簡略化とかいう話があるようなので、Account Auto-Discoveryを材料にもう少し構文のお勉強をしておこう。昨日の例のRDF/XMLは、rdf:parseType="Resource"を用いて多少簡略化できる。しかしこの属性と他のプロパティ属性を同じ要素に書くことはできないので、注意が必要。

Turtle/N3版を記述する時にdc:creatorをfoaf:makerとし(名前空間宣言を節約)、さらに不要なクラスを略してコンパクト化を図った。同じことをXML構文で書いてみると、次のようになる。

(例)

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:foaf="http://xmlns.com/foaf/0.1/">
 <rdf:Description rdf:about="http://www.hatena.ne.jp/info/perl/autodiscovery/test">
  <foaf:maker rdf:parseType="Resource">
    <foaf:holdsAccount rdf:parseType="Resource">
     <foaf:accountName>hatena</foaf:accountName>
     <foaf:accountServiceHomepage rdf:resource="http://www.hatena.ne.jp/"/>
    </foaf:holdsAccount>
  </foaf:maker>
 </rdf:Description>
</rdf:RDF>

RDF/XMLは、ノードとアーク(プロパティ)を表す要素をサンドイッチのように交互に記述することで、主語-述語-目的語のトリプル構造を写し取る構文だ。ノードがパンで、プロパティがハムという感じね。ここから型付きノード要素(パン)であるfoaf:Personfoaf:OnlineAccountを省略すると、この形が崩れて(ハムどうしがくっついて)、トリプルがどうなっているのか分からなくなってしまう。

rdf:parseType="Resource"という属性は、プロパティである要素をリソース(ノード)とも見なすことで、サンドイッチ構造を回復する機能だ。つまり、プロパティであるfoar:makerfoaf:holdsAccountは本来ハムなんだけど、一緒に薄いパン(空白ノード)もくっついているかのように扱うわけ。だから、これらの子要素にfoaf:accountServiceHomepageなどのプロパティ要素(ハム)を書いても、サンドイッチが成り立っている。

この省略構文で16行が12行になったので、多少はコンパクトになった。さて、ここで気を付けたいのが、昨日の例ではfoaf:OnlineAccount要素のプロパティ属性として記述していたfoaf:accountNameは、今度はプロパティ“要素”としてfoaf:holdsAccountの子要素にしなければならないこと。rdf:parseType="Resource"とプロパティ属性は併記できないから、次のように書くと誤りになってしまう。

(誤った例)

  <foaf:maker rdf:parseType="Resource">
    <foaf:holdsAccount foaf:accountName="hatena" rdf:parseType="Resource">
     <foaf:accountServiceHomepage rdf:resource="http://www.hatena.ne.jp/"/>
    </foaf:holdsAccount>
  </foaf:maker>

ハムとパンがくっついているところに、無理にもう一枚ハムをねじ込んではいけないというわけだ。

RDF/XMLはすぐに長いとか煩雑といわれるので、様々な省略構文が用意されているのだが、それらを適切に組み合わせるのは慣れないとややこしいかも。RDF/XMLを使うなら、多少冗長に感じられても、グラフがきちんと頭に思い描ける構文で書くことが、理解の早道です(いや、自分で書かなくても、ツールに生成させればいいんですけどね)。はっきりしない時は、RDF ValidatorRDF/XMLのチェックと視覚化ツールで実際にグラフを描いてみよう。

関連メモ:
genre: rdf. at