まだ簡略化とかいう話があるようなので、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:makerrdf:parseType="Resource"
> <foaf:holdsAccountrdf: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:Person
やfoaf:OnlineAccount
を省略すると、この形が崩れて(ハムどうしがくっついて)、トリプルがどうなっているのか分からなくなってしまう。
rdf:parseType="Resource"
という属性は、プロパティである要素をリソース(ノード)とも見なすことで、サンドイッチ構造を回復する機能だ。つまり、プロパティであるfoar:maker
やfoaf:holdsAccount
は本来ハムなんだけど、一緒に薄いパン(空白ノード)もくっついているかのように扱うわけ。だから、これらの子要素にfoaf:accountServiceHomepage
などのプロパティ要素(ハム)を書いても、サンドイッチが成り立っている。
この省略構文で16行が12行になったので、多少はコンパクトになった。さて、ここで気を付けたいのが、昨日の例ではfoaf:OnlineAccount
要素のプロパティ属性として記述していたfoaf:accountName
は、今度はプロパティ“要素”としてfoaf:holdsAccount
の子要素にしなければならないこと。rdf:parseType="Resource"
とプロパティ属性は併記できないから、次のように書くと誤りになってしまう。
(誤った例)
<foaf:maker rdf:parseType="Resource"> <foaf:holdsAccountfoaf:accountName
="hatena"rdf:parseType="Resource"
> <foaf:accountServiceHomepage rdf:resource="http://www.hatena.ne.jp/"/> </foaf:holdsAccount> </foaf:maker>
ハムとパンがくっついているところに、無理にもう一枚ハムをねじ込んではいけないというわけだ。
RDF/XMLはすぐに長いとか煩雑といわれるので、様々な省略構文が用意されているのだが、それらを適切に組み合わせるのは慣れないとややこしいかも。RDF/XMLを使うなら、多少冗長に感じられても、グラフがきちんと頭に思い描ける構文で書くことが、理解の早道です(いや、自分で書かなくても、ツールに生成させればいいんですけどね)。はっきりしない時は、RDF ValidatorやRDF/XMLのチェックと視覚化ツールで実際にグラフを描いてみよう。
- コメントにするならXMLでなくてもいいのでは (2005-07-28)