SPARQLでRDFのグラフを検索した結果は、XSLTを適用すれば柔軟に視覚表現が可能だが、検索のパターンごとにXSLTを新たに作成するのは手間がかかる。それならば、取り出す結果をSELECT句で指定する代わりに、CONSTRUCT句で元のグラフと同じ形のXMLをつくることで、元データ用のXSLTをそのまま流用できるではないか。
ということで、いくつか実験。位置情報を持つRSS写真アルバムから緯度経度の範囲を指定してデータを取り出す例と、コンサートカレンダーから作曲家を指定して希望の演奏会を取り出す例をつくってみた。いずれも、データを地図上にマップしたり、月間カレンダーを生成したりするので、XSLT(およびCSS)はかなり複雑になるのだが、うまい具合に元データのXSLTがそのまま適用できる。
CONSTRUCTで元データと同様のグラフを生成するのは、WHERE句のパターンとほぼ同じものを用いればよいので、実は簡単だ。たとえば、rss:item型のリソースでrss:titleプロパティの値に"RDF"を含むものを取りだして、結果を同じrss:itemの形にするなら次のようになる。
(例)
CONSTRUCT { ?item a rss:item . ?item rss:title ?title . ?item rss:link ?link . ?item rss:description ?desc . ?item dc:date ?date } WHERE { ?item a rss:item . ?item rss:title ?title . ?item rss:link ?link . ?item rss:description ?desc . ?item dc:date ?date . FILTER regex (?title, "RDF") }
CONSTRUCT句とWHERE句を比べてみると、絞り込みの条件であるFILTER以外は全く同じであることが分かる。元とは異なるグラフを生成する時は、もちろんCONSTRUCT句も違ってくるわけだが、同じものが必要ならほとんどコピーするだけ。生成されるRDFは、channel要素などを持たないRSSもどきにしかならないものの、rss:itemだけを見ているアプリケーション(XSLT)なら十分機能する。CONSTRUCTは、けっこう使い途がありそうだ。
- SPARQLによるRDF画像アノテーションの検索 (2005-05-29)