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

20. 推論実行

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

20.1. 実行の流れ

では実際に推論を行ってみましょう。推論を行う基本的な流れは次のようになります。

  1. ReasonerRegistry.get~Reasoner() メソッドにより必要な Reasoner を取得する。
  2. Reasoner にスキーマorオントロジのデータをバインドする。
  3. ModelFactory.createInfModel(Reasoner reasoner, Model model) メソッドにより InfModelオブジェクトを生成する。

次のプログラムはこの流れに沿って書かれた1例です。

1:  import com.hp.hpl.jena.rdf.model.InfModel;
2:  import com.hp.hpl.jena.rdf.model.Model;
3:  import com.hp.hpl.jena.rdf.model.ModelFactory;
4:  import com.hp.hpl.jena.reasoner.Reasoner;
5:  import com.hp.hpl.jena.reasoner.ReasonerRegistry;
6:  import com.hp.hpl.jena.util.FileManager;
7:  
8:  public class ReasonerTest {
9:    public static void main(String[] args) {
10:     Model schema = FileManager.get().loadModel("file:schema.rdf");
11:     Model model = FileManager.get().loadModel("file:model.rdf");
12:  
13:     Reasoner rdfsReasoner = 
14:          ReasonerRegistry.getRDFSSimpleReasoner();//--1--
15:     Reasoner reasoner = 
16:          rdfsReasoner.bindSchema(schema);//--2--
17:
18:     InfModel inf = 
19:          ModelFactory.createInfModel(reasoner, model);//--3--
20:  
21:     inf.write(System.out, "RDF/XML-ABBREV");
22:   }
23: }

このプログラムを次のサンプルに対して実行してみます。 schema.rdf は「親である(isParentOf)というプロパティの主語と目的語は人(Person)である」というスキーマを表します。
またmodel.rdf は「太郎(Taro)は花子(Hanako)の親(isParentOf)である」という情報です。

<!--schema.rdf-->
<?xml version="1.0"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <rdf:Property rdf:about="http://4dd.co.jp/sample/isParentOf">
    <rdfs:range rdf:resource="http://4dd.co.jp/sample/Person"/>
    <rdfs:domain rdf:resource="http://4dd.co.jp/sample/Person"/>
  </rdf:Property>
</rdf:RDF>
<!--model.rdf -->
<?xml version="1.0"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://4dd.co.jp/sample/">
  <rdf:Description rdf:about="http://4dd.co.jp/sample/Taro">
    <isParentOf rdf:resource="http://4dd.co.jp/sample/Hanako"/>
  </rdf:Description>
</rdf:RDF>

その結果は以下のようになります。

<rdf:RDF
    xmlns="http://4dd.co.jp/sample/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <rdf:Property rdf:about="http://4dd.co.jp/sample/isParentOf">
    <rdfs:range rdf:resource="http://4dd.co.jp/sample/Person"/>
    <rdfs:domain rdf:resource="http://4dd.co.jp/sample/Person"/>
  </rdf:Property>
  <Person rdf:about="http://4dd.co.jp/sample/Hanako"/>
  <Person rdf:about="http://4dd.co.jp/sample/Taro">
    <isParentOf rdf:resource="http://4dd.co.jp/sample/Hanako"/>
  </Person>
</rdf:RDF>

ご覧のようにTaro と Hanako の型が Person になります。 これは schema.rdf と model.rdf のどちらにも直接は含まれていません。 RDFS の規則に則って推論が行われたことによって発見されます。

また ReasonerRegistry.getRDFSSimpleReasoner() によって得た Reasoner を使用したため RDFS の公理が含まれていません。 ReasonerRegistry.getRDFSReasoner() を使用して試してみると次のようになります。

<rdf:RDF
    xmlns="http://4dd.co.jp/sample/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <rdfs:Datatype rdf:about=
      "http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral">
    <rdf:type>
      <rdfs:Class rdf:about=
          "http://www.w3.org/2000/01/rdf-schema#Class"/>
    </rdf:type>
    <rdf:type>
      <rdfs:Class rdf:about=
          "http://www.w3.org/2000/01/rdf-schema#Resource"/>
    </rdf:type>
  </rdfs:Datatype>
  <rdfs:Class rdf:about=
      "http://www.w3.org/1999/02/22-rdf-syntax-ns#Property">
    <rdfs:subClassOf>
      ……

ReasonerRegistry.getOWLReasoner() を使用するとさらに OWL の公理も追加されるます。 一方、ReasonerRegistry.getTransitiveReasoner() を使用した場合は、rdfs:range や rdfs:domain が解釈されません。 そのため単に schema.rdf と model.rdf がマージされるだけに終わります。



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

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