13. 問い合わせ2006.03.20 株式会社四次元データ 中井隆史
Jena 13章 問い合わせ
13.1. 問い合わせ処理用のメソッドJena は RDQL や SPARQL といった検索言語をサポートしています。 しかしあるステートメントが含まれるかどうかを調べたい、 あるプロパティを持つリソースを全て取得したいなど、簡単な問い合わせは、Model や Resource インタフェースのメソッドでも調べることができます。 本章ではこのようなインタフェースのメソッドを利用した問い合わせについて説明します。 Resource にも問い合わせ用のメソッドがありますが、 Model のメソッドを使用した問い合わせはより多様な問い合わせが可能です。 あるステートメントやリソースなどが含まれるかどうかを調べための Model のメソッドには contain…()、取得するメソッドには list…() という名前が付けられています。 代表的なものには次のようなものがあります。 ステートメントが含まれるかどうかを調べるメソッド
取得をするメソッド
最後に Resource と Model のメソッドを使用した問い合わせのサンプルコードを見てみましょう。 次の RDFSample4 は RSS (http://www.techscore.com/rss/rss.rdf) を読み込み、 含まれる各更新情報のタイトルを取得するものです。 RSS例(名前空間や関係の無い部分は省略しています。) <?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF ……>
<channel rdf:about="http://www.techscore.com/rss/rss.rdf">
<title>?プログラミング学習サイト?TECHSCORE</title>
……
<items>
<rdf:Seq>
<rdf:li
rdf:resource="http://www.techscore.com/choistudy/"/>
<rdf:li
rdf:resource="http://www.techscore.com/choistudy/top.do"/>
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://www.techscore.com/choistudy/">
<title>[Choistudy] 週末限定!第2回Java試験 を実施!(10/1、10/2)</title>
……
</item>
<item rdf:about="http://www.techscore.com/choistudy/top.do">
<title>[Choistudy] 学習カテゴリ「eclipse ショートカット」 を追加</title>
……
</item>
</rdf:RDF>
サンプルコード(RDFSample4.java) 1: import com.hp.hpl.jena.rdf.model.ResIterator;
2: import com.hp.hpl.jena.rdf.model.Model;
3: import com.hp.hpl.jena.rdf.model.Resource;
4: import com.hp.hpl.jena.rdf.model.Statement;
5: import com.hp.hpl.jena.util.FileManager;
6: import com.hp.hpl.jena.vocabulary.RDF;
7: import com.hp.hpl.jena.vocabulary.RSS;
8:
9: public class RDFSample4 {
10: public static void main(String[] args) {
11: Model model = model=FileManager.get().loadModel(
12: "http://www.techscore.com/rss/rss.rdf");
13:
14: ResIterator items = model.listSubjectsWithProperty(
15: RDF.type, RSS.item);
16: while(items.hasNext()){
17: Resource item = items.nextResource();
18: Statement title = item.getProperty(RSS.title);
19: System.out.println(title.getObject());
20: }
21: }
22: }
RSS では個々の更新はデータ型 (述語 rdf:type の値) が rss:item のリソースで表されます。 そのため 11,12 行目のデータロード後、まず14行目の listSubjectsWithProperty メソッドによって、 述語が RDF.type、目的語が RSS.item のステートメントの主語を全て取得します。 戻り値 items の型の ResIterator は Iterator のサブクラスでリソースを扱いやすくしたものです。 16-20行目では items に次が存在する限りループします。 そのうち 17 行目は items の nextResource メソッドによって次のリソースを item に取り出します。 次に18行目で item を主語、rss:title を述語とするステートメントを item.getProperty によって取得します (複数あることが想定される場合は listProperties を使用するの方が良いかもしれません) 。 最後にそのステートメントの目的語を出力します。上の RSS の例に対してこのサンプルコードが適用された場合、出力は次のようになります。 出力 [Choistudy] 週末限定!第2回Java試験 を実施!(10/1、10/2) [Choistudy] 学習カテゴリ「eclipse ショートカット」 を追加 |
![]()
![]()
|