20. 推論実行2006.06.01 株式会社四次元データ 中井隆史
Jena 20章 推論実行
20.1. 実行の流れでは実際に推論を行ってみましょう。推論を行う基本的な流れは次のようになります。
次のプログラムはこの流れに沿って書かれた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)である」というスキーマを表します。 <!--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 がマージされるだけに終わります。 |
![]()
![]()
|