ちょっとしたメモ

SPARQLのCONSTRUCT句とXSLT

SPARQLRDFのグラフを検索した結果は、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は、けっこう使い途がありそうだ。

関連メモ: