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

14. ステートメントの編集

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

14.1. ステートメントの編集

既に RDF モデルに含まれてるステートメントを編集する必要があるときがあります。 Jena ではステートメントの編集を Statement インタフェースで行います。 ただしStatement インタフェースで行える編集は、目的語の変更だけです。 主語や述語を変更したい場合は、ステートメントを一度削除して追加し直します。

ステートメントの編集を行うためには、まず対象の Statement オブジェクトを取得します。 そして changeObject() メソッドを使って目的語を変更します。 changeObject() メソッドは次のような引数をとり、 そのステートメントの目的語を引数に指定したものに変更します。

  • Statement changeObject(基本データ型/*int, double等*/ o)
  • Statement changeObject(java.lang.Object o)
  • Statement changeObject(RDFNode o)
  • Statement changeObject(java.lang.String o)
  • Statement changeObject(java.lang.String o, java.lang.String l)

以下に例を示します。ここで紹介するサンプルコードは 11.2.で使用したサンプルコードの 出力(example1.rdfとします)に編集を加えるものです。 具体的には "http://tech.4dd.co.jp" の作者である"四次元太郎"のメールアドレスを "taro@4dd.co.jp"に変更します。

変更前

<!--example1.rdf-->

<?xml version="1.0" encoding="Shift_JIS"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
  <rdf:Description rdf:about="http://tech.4dd.co.jp">
    <dc:creator rdf:parseType="Resource">
      <vcard:EMAIL>yojigen@4dd.co.jp</vcard:EMAIL>
      <vcard:NAME>四次元太郎</vcard:NAME>
    </dc:creator>
  </rdf:Description>
</rdf:RDF>

サンプルコード(RDFSample5.java)

1:  import com.hp.hpl.jena.rdf.model.Model;
2:  import com.hp.hpl.jena.rdf.model.NodeIterator;
3:  import com.hp.hpl.jena.rdf.model.RDFWriter;
4:  import com.hp.hpl.jena.rdf.model.Resource;
5:  import com.hp.hpl.jena.rdf.model.Statement;
6:  import com.hp.hpl.jena.rdf.model.StmtIterator;
7:  import com.hp.hpl.jena.util.FileManager;
8:  
9:  import com.hp.hpl.jena.vocabulary.DC;
10: import com.hp.hpl.jena.vocabulary.VCARD;
11: 
12: public class RDFSample5 {
13:   public static void main(String[] args) {
14:     Model model = FileManager.get().loadModel(
15:                       "http://example.ne.jp/example1.rdf");
16: 
17:     Resource tech = model.createResource("http://tech.4dd.co.jp");
18:     NodeIterator creators = 
19:                     model.listObjectsOfProperty(tech, DC.creator);
20: 
21:     while(creators.hasNext()){
22:       Resource creator = (Resource)(creators.nextNode());
23: 
24:       if(creator.hasProperty(VCARD.NAME,"四次元太郎")){
25:         StmtIterator taro = creator.listProperties(VCARD.EMAIL);
26: 	
27:         while(taro.hasNext()){
28:           Statement eMail = taro.nextStatement();
29:           eMail.changeObject("taro@4dd.co.jp");
30:         }
31:       }
32:     }
33:
34:     try {
35:       RDFWriter writer = model.getWriter("RDF/XML-ABBREV");
36:       writer.setProperty("showXMLDeclaration","true");
37:       writer.write(model, System.out, "");
38:     } catch (Exception e) {
39:       e.printStackTrace();
40:     }
41:   }
42: }

まず最初に "http://tech.4dd.co.jp" の作者を表すリソースを取得します。 そのために17行目で "http://tech.4dd.co.jp" を表す Resource を取得しています。 そして18行目で "http://tech.4dd.co.jp" を主語とするステートメントの中から dc:creator を述語として持つものの目的語を取得します。 ここでは Model インタフェースのメソッドを使っています。

次に 21-32 行目で "http://tech.4dd.co.jp" の作者の中から名前(プロパティ vCard:Name の目的語)が"四次元太郎"であるステートメントを探し出します。 25 行目でこの条件に合致するリソースを主語として、 vCard:EMAIL を述語とするステートメントを取得します。 ここでは Model インタフェースのメソッドを使っています。 27-30行目で、これまでの条件にあったステートメントについて目的語を"taro@4dd.co.jp"に変更しています。 出力が次のようになれば成功です。

変更後

<!--example2.rdf-->

<?xml version="1.0" encoding="Shift_JIS"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
  <rdf:Description rdf:about="http://tech.4dd.co.jp">
    <dc:creator rdf:parseType="Resource">
      <vcard:EMAIL>taro@4dd.co.jp</vcard:EMAIL>
      <vcard:NAME>四次元太郎</vcard:NAME>
    </dc:creator>
  </rdf:Description>
</rdf:RDF>

ここでは簡単化のために、 creators.nextNode() の 返り値をResource として受けていますが、これは必ずしも正しくありません。 Literal である可能性もあるからです。 分からない場合はRDFNode で受けたあとに canAs メソッドや as メソッドもしくは instanceOf 演算子を利用して適切に処理しましょう。



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

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