나는 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>
...
프로그래밍 방식으로 이런 종류의 제한을 다루는 권장 된 방법은 무엇입니까? 미리 많은 감사드립니다!
Michael의 대답은 정확하지만 모델링 문제는 해결되지 않습니다. 사례를위한 해결책 : 세 가지 클래스를 모두 분리하십시오. 이는 한 클래스에있는 것이 다른 클래스에 속할 수 없다는 것을 시스템에 알려줍니다. 그런 식으로 코드가 예상대로 작동합니다. – Decrayer