Apache Jena是否支持对OWL限制的推理?

时间:2018-02-06 18:01:15

标签: rdf jena owl rdfs reasoning

Jena的OWL推理列表here的功能似乎暗示Jena支持对限制类进行推理。

但是,我并不认为这是真的。具体来说,我有一个被检测为特定类的实体,即使它缺少一个带有minCardinality的限制所指示的属性。

但是,我不确定我做错了什么,我的OWL有点生疏。

我的数据:

<?xml version="1.0"?>
<rdf:RDF xmlns      = "http://www.example.com/people#"
         xml:base   = "http://www.example.com/people#"
         xmlns:owl  = "http://www.w3.org/2002/07/owl#"
         xmlns:rdf  = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:rdfs = "http://www.w3.org/2000/01/rdf-schema#"
         xmlns:xsd  = "http://www.w3.org/2001/XMLSchema#">

    <owl:DatatypeProperty rdf:ID="name">
        <rdfs:domain rdf:resource="#Person"/>
        <rdfs:range rdf:resource="xsd:string"/>
    </owl:DatatypeProperty>

    <owl:DatatypeProperty rdf:ID="age">
        <rdfs:domain rdf:resource="#Person"/>
        <rdfs:range rdf:resource="xsd:nonNegativeInteger"/>
    </owl:DatatypeProperty>

    <owl:Class rdf:ID="Person">
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="#name"/>
                <owl:cardinality rdf:datatype="xsd:nonNegativeInteger">1</owl:cardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="#age"/>
                <owl:cardinality rdf:datatype="xsd:nonNegativeInteger">1</owl:cardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
    </owl:Class>

    <!-- Is a person, because it's got a name and age -->
    <rdf:Description rdf:about="#john">
        <name>John</name>
        <age rdf:datatype="xsd:nonNegativeInteger">42</age>
    </rdf:Description>

    <!-- Should not be a person, because it's missing an age -->
    <rdf:Description rdf:about="#zeus">
        <name>Zeus</name>
    </rdf:Description>

</rdf:RDF>

我的代码:

 public static void main(String args[]) {
        System.out.println("hello world");

        OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF);

        model.read("src/main/resources/sample.owl");

        String queryString =
                "PREFIX ppl:  <http://www.example.com/people#>" +
                "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>" +
                "SELECT ?obj " +
                "WHERE {" +
                "  ?obj rdf:type ppl:Person ." +
                "}";

        Query query = QueryFactory.create(queryString);
        QueryExecution qe = QueryExecutionFactory.create(query, model);
        ResultSet results = qe.execSelect();
        ResultSetFormatter.out(System.out, results, query);
        qe.close();   
    }

输出:

------------
| obj      |
============
| ppl:john |
| ppl:zeus |
------------

我不希望ppl:zeus成为Person的实例,因为它不符合年龄的minCardinality限制。

关于我在这里做错了什么的建议?围绕限制类推理rdfs:domain的推理是什么?

1 个答案:

答案 0 :(得分:0)

对此的解释实际上是因为我在考虑OWL和RDF推理方面犯了一个新手错误。

简单的解释(正如评论中所指出的)是,属性上的rdfs:domain 足够,因为推理器可以确定该实体是Person。如果实体是name的主题,则它是Person的实例,Q.E.D。

然而,这引出了另一个问题。限制类明确指出,除非同时具有nameage,否则一个人。那么为什么这不是逻辑上的不一致呢?我有一条数据说Zeus 一个Person,另一条数据说他,不是吗?

嗯,不。因为即使我以前曾经多次遇到它,我再次绊倒了开放世界的推理模型。这是因为假设您实际上没有所有事实,并且即使系统未明确断言可能的事情也会发生所有推理是真的。

换句话说,仅仅因为我的数据没有明确说明Zeus有age,并不意味着他没有。其他任何人都可以随时出现并确定一个年龄。

因此,通常情况下,minCardinality约束无法通过开放世界推理实际执行或检查。

maxCardinality是一个不同的故事,在类似的情况下会导致不一致的本体错误。