2012-04-02 3 views
1

나는 OWL 온톨로지를 만들기 위해 OWL API을 사용하려고한다. 클래스, 개인 및 이들 사이의 관계를 정의 할 수 있습니다.OWL API : 도메인 및 범위 제한을 보장하는 방법

도메인 #A 및 범위 #B이있는 ObjectProperty #hasPart을 정의 할 때이 속성은이 두 클래스의 개인에만 적용될 수 있다고 예상했습니다. 그러나 사실 API는 제한에 대해 상관하지 않는다, 그래서 하나의 예를 들어 클래스 #C 두 부재 사이도 #hasPart을 할당 할 수 있습니다

import org.semanticweb.owlapi.apibinding.OWLManager; 
import org.semanticweb.owlapi.model.*; 

public class OwlTest 
{ 
    public static void main(String[] args) 
    throws org.semanticweb.owlapi.model.OWLOntologyStorageException, org.semanticweb.owlapi.model.OWLOntologyCreationException, Exception 
    { 
     OWLOntologyManager manager = OWLManager.createOWLOntologyManager(); 
     OWLDataFactory df = manager.getOWLDataFactory(); 
     OWLOntology o = manager.createOntology(); 

     //------------------------------------------------------------------ 

     OWLClass clsA = df.getOWLClass(IRI.create("#A")); 
     OWLClass clsB = df.getOWLClass(IRI.create("#B")); 
     OWLClass clsC = df.getOWLClass(IRI.create("#C")); 

     OWLObjectProperty hasPart = df.getOWLObjectProperty(IRI.create("#hasPart")); 
     OWLObjectPropertyDomainAxiom domainAxiom = df.getOWLObjectPropertyDomainAxiom(hasPart, clsA); 
     OWLObjectPropertyRangeAxiom rangeAxiom = df.getOWLObjectPropertyRangeAxiom(hasPart, clsB); 

     manager.addAxiom(o, domainAxiom); 
     manager.addAxiom(o, rangeAxiom); 

     //------------------------------------------------------------------ 

     OWLNamedIndividual a1 = df.getOWLNamedIndividual(IRI.create("a1")); 
     OWLNamedIndividual b1 = df.getOWLNamedIndividual(IRI.create("b1")); 
     OWLNamedIndividual c1 = df.getOWLNamedIndividual(IRI.create("c1")); 
     OWLNamedIndividual c2 = df.getOWLNamedIndividual(IRI.create("c2")); 

     manager.addAxiom(o, df.getOWLClassAssertionAxiom(clsA, a1)); 
     manager.addAxiom(o, df.getOWLClassAssertionAxiom(clsB, b1)); 
     manager.addAxiom(o, df.getOWLClassAssertionAxiom(clsC, c1)); 
     manager.addAxiom(o, df.getOWLClassAssertionAxiom(clsC, c2)); 

     manager.addAxiom(o, df.getOWLObjectPropertyAssertionAxiom(hasPart, c1, c2)); // ObjectProperty '#hasPart' should only work for objects from Domain 'clsA' and Range 'clsB' 

     //------------------------------------------------------------------ 

     manager.saveOntology(o, IRI.create("file:/tmp/data.owl")); 
    } 
} 

출력 /tmp/data.owl : 지금 찾고 있어요

... 
    <ObjectProperty rdf:about="#hasPart"> 
     <rdfs:domain rdf:resource="#A"/> 
     <rdfs:range rdf:resource="#B"/> 
    </ObjectProperty> 

    <Class rdf:about="#A"/> 
    <Class rdf:about="#B"/> 
    <Class rdf:about="#C"/> 

    <NamedIndividual rdf:about="a1"> 
     <rdf:type rdf:resource="#A"/> 
    </NamedIndividual> 

    <NamedIndividual rdf:about="b1"> 
     <rdf:type rdf:resource="#B"/> 
    </NamedIndividual> 

    <NamedIndividual rdf:about="c1"> 
     <rdf:type rdf:resource="#C"/> 
     <p1:hasPart rdf:resource="c2"/> 
    </NamedIndividual> 
... 

프로그래밍 방식으로 이런 종류의 제한을 다루는 권장 된 방법은 무엇입니까? 미리 많은 감사드립니다!

답변

3

예, C/W hasPart를 사용하여 아무 문제가 없다는 추론 당신은 결국 그 (C1)는 또한 A는, 또는 C는 A.

과 동일 그것을 말해주지 가정 불과합니다 OWL- API는 원하는 동작을 시행하지 않으므로 정상적인 관계형 시스템에서와 같이 일종의 무결성 제약 조건을 찾는 것처럼 들릴 수 있습니다. 신청서에 해당 내용을 구워야하거나 Pellet의 integrity constraints과 같은 내용을 살펴볼 예정이며, Pellet 3 릴리즈에서 사용할 수 있으며 현재 Stardog으로 이용할 수 있습니다.

+2

Michael의 대답은 정확하지만 모델링 문제는 해결되지 않습니다. 사례를위한 해결책 : 세 가지 클래스를 모두 분리하십시오. 이는 한 클래스에있는 것이 다른 클래스에 속할 수 없다는 것을 시스템에 알려줍니다. 그런 식으로 코드가 예상대로 작동합니다. – Decrayer