Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

13. 問い合わせ

2006.03.20 株式会社四次元データ 中井隆史

13.1. 問い合わせ処理用のメソッド

Jena は RDQL や SPARQL といった検索言語をサポートしています。 しかしあるステートメントが含まれるかどうかを調べたい、 あるプロパティを持つリソースを全て取得したいなど、簡単な問い合わせは、Model や Resource インタフェースのメソッドでも調べることができます。 本章ではこのようなインタフェースのメソッドを利用した問い合わせについて説明します。

Resource にも問い合わせ用のメソッドがありますが、 Model のメソッドを使用した問い合わせはより多様な問い合わせが可能です。 あるステートメントやリソースなどが含まれるかどうかを調べための Model のメソッドには contain…()、取得するメソッドには list…() という名前が付けられています。 代表的なものには次のようなものがあります。

ステートメントが含まれるかどうかを調べるメソッド

メソッド 説明
boolean containsResource(RDFNode r) この RDF モデルに含まれるステートメントに r が 主語もしくは述語、目的語として出現するならば true を返します。
boolean contains(Resource s, Property p) s を主語, p を述語とするステートメントが含まれるとき true を返します。s や p に null を 指定すると任意として扱われます。
boolean contains(Resource s, Property p, 基本データ型/*int, double等*/ o) 主語、述語、目的語がそれぞれ s, p, o のステートメントが含まれるとき true を返します。
boolean contains(Resource s, Property p, java.lang.String o) 主語、述語、目的語がそれぞれ s, p, o のステートメントが含まれるとき true を返します。
boolean contains(Resource s, Property p, RDFNode o) 主語、述語、目的語がそれぞれ s, p, o のステートメントが含まれるとき true を返します。 sやp、o に null を指定すると任意として扱われます。
boolean contains(Statement s) ステートメント s が含まれるとき true を返します。
boolean containsAll(Model model) model に含まれる全てのステートメントを含むとき true を返します。
boolean containsAny(StmtIterator iter) iter に含まれるもののうち1つ以上のステートメントを含むとき true を返します。

取得をするメソッド

メソッド 説明
StmtIterator listStatements() この RDF モデルに含まれる全てのステートメントを返します。
StmtIterator listStatements(Resource s, Property p, 基本データ型/*int, double等*/ o) 主語、述語、目的語がそれぞれ s, p, o のステートメントを全て返します。
StmtIterator listStatements(Resource s, Property p, java.lang.String o)
StmtIterator listStatements(Resource s, Property p, RDFNode o) 主語、述語、目的語がそれぞれ s, p, o のステートメントを全て返します。
ResIterator listSubjects() この RDF モデルに含まれるステートメントの主語を全て返します。
ResIterator listSubjectsWithProperty(Property p) この RDF モデルに含まれるステートメントのうち述語が p のステートメントの主語を全て返します。
ResIterator listSubjectsWithProperty(Property p, RDFNode o) この RDF モデルに含まれるステートメントのうち述語が p、目的語が o のステートメントの主語を全て返します。
ResIterator listSubjectsWithProperty(Property p, 基本データ型/*int, double等*/ o)
ResIterator listSubjectsWithProperty(Property p, java.lang.String o)
NodeIterator listObjects() RDF モデルに含まれる全てのステートメントの目的語を返します。
NodeIterator listObjectsOfProperty(Property p) この RDF モデルに含まれるステートメントのうち述語が p のステートメントの目的語を全て返します。
NodeIterator listObjectsOfProperty(Resource s, Property p) この RDF モデルに含まれるステートメントのうち主語が s、述語が p のステートメントの目的語を全て返します。
RSIterator listReifiedStatements() RDFモデルに含まれる全ての具体化ステートメントを返します。
RSIterator listReifiedStatements(Statement st) RDFモデルに含まれる st を具体化した全てのリソースを返します。

最後に 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 ショートカット」 を追加


前のページへ TECHSCOREのTOPページへ 次のページへ
TECHSCORE PR
PR
PR
PR
PR
PR

techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa