【问题标题】:OWL API: How to ensure Domain and Range restrictions?OWL API:如何确保域和范围限制?
【发布时间】:2012-04-16 07:06:36
【问题描述】:

我尝试使用OWL API 来创建OWL Ontologies。我可以定义类、个体和它们之间的关系。

当我用域#A 和范围#B 定义对象属性#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>
...

我现在正在寻找以编程方式处理此类限制的推荐方法..?非常感谢!

【问题讨论】:

    标签: dns range owl restriction


    【解决方案1】:

    是的,使用 hasPart w/C 并没有错,推理者只会假设您最终会告诉它 c1 也是 A,或者 C 与 A 相同。

    OWL-API 不会强制执行您想要的行为,听起来您正在寻找某种完整性约束,就像在正常的关系系统中一样。您要么必须将其烘焙到您的应用程序中,要么查看 Pellet 的 integrity constraints 之类的东西,它将在即将发布的 Pellet 3 版本中提供,目前在 Stardog 中提供。

    【讨论】:

    • Michael 的这个回答是正确的,但是,它不能解决建模问题。您的案例的解决方案:使所有三个类都分离。这告诉系统,属于一个类的事物不能属于任何其他类。这样一来,您的代码就会像您期望的那样工作。
    猜你喜欢
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多