14. ステートメントの編集2006.03.27 株式会社四次元データ 中井隆史
Jena 14章 ステートメントの編集
14.1. ステートメントの編集既に RDF モデルに含まれてるステートメントを編集する必要があるときがあります。 Jena ではステートメントの編集を Statement インタフェースで行います。 ただしStatement インタフェースで行える編集は、目的語の変更だけです。 主語や述語を変更したい場合は、ステートメントを一度削除して追加し直します。 ステートメントの編集を行うためには、まず対象の Statement オブジェクトを取得します。 そして changeObject() メソッドを使って目的語を変更します。 changeObject() メソッドは次のような引数をとり、 そのステートメントの目的語を引数に指定したものに変更します。
以下に例を示します。ここで紹介するサンプルコードは 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 演算子を利用して適切に処理しましょう。 |
![]()
![]()
|