Apache Jena 是否支持对 OWL 限制的推理?
Does Apache Jena support reasoning over OWL restrictions?
列出的 Jena OWL 推理器的功能 here 似乎暗示 Jena 支持对限制的推理 classes。
但是,我没有观察到这是真的。具体来说,我有一个被检测到属于特定 class 的实体,即使它缺少 属性,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
的实例,因为它不满足年龄的最小基数限制。
对我在这里做错了什么有什么建议吗?围绕 rdfs:domain
的推理是否覆盖了围绕限制 class 的推理?
这个解释其实是因为我在思考OWL和RDF推理时犯了一个菜鸟错误
简单的解释(如评论中指出的)是 属性 上的 rdfs:domain
足够 推理者可以决定实体是 Person
。如果实体是 name
的主题,则它是 Person
、Q.E.D.
的实例
然而,这引出了另一个问题。限制 class 清楚地表明它是 不是 一个人,除非它同时具有 name
和 age
。那么为什么这不是逻辑上的矛盾呢?我有一条数据说 Zeus is a Person
,另一条数据说 he's not, don't我?
嗯,不。因为虽然我之前遇到过很多次,但我又一次被开放世界的推理模型绊倒了。也就是说,所有推理都是在假设您实际上并没有所有事实的情况下发生的,并且即使系统没有明确 断言,事情 可能 是真的 他们是真的。
换句话说,仅仅因为我的数据没有明确说明 Zeus 有 age
,并不意味着他没有。其他人可以随时出现并确定年龄。
因此,一般来说,minCardinality
约束无法通过开放世界推理真正强制执行或检查。
maxCardinality
是另一回事,在类似情况下确实会导致不一致的 ontology 错误。
列出的 Jena OWL 推理器的功能 here 似乎暗示 Jena 支持对限制的推理 classes。
但是,我没有观察到这是真的。具体来说,我有一个被检测到属于特定 class 的实体,即使它缺少 属性,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
的实例,因为它不满足年龄的最小基数限制。
对我在这里做错了什么有什么建议吗?围绕 rdfs:domain
的推理是否覆盖了围绕限制 class 的推理?
这个解释其实是因为我在思考OWL和RDF推理时犯了一个菜鸟错误
简单的解释(如评论中指出的)是 属性 上的 rdfs:domain
足够 推理者可以决定实体是 Person
。如果实体是 name
的主题,则它是 Person
、Q.E.D.
然而,这引出了另一个问题。限制 class 清楚地表明它是 不是 一个人,除非它同时具有 name
和 age
。那么为什么这不是逻辑上的矛盾呢?我有一条数据说 Zeus is a Person
,另一条数据说 he's not, don't我?
嗯,不。因为虽然我之前遇到过很多次,但我又一次被开放世界的推理模型绊倒了。也就是说,所有推理都是在假设您实际上并没有所有事实的情况下发生的,并且即使系统没有明确 断言,事情 可能 是真的 他们是真的。
换句话说,仅仅因为我的数据没有明确说明 Zeus 有 age
,并不意味着他没有。其他人可以随时出现并确定年龄。
因此,一般来说,minCardinality
约束无法通过开放世界推理真正强制执行或检查。
maxCardinality
是另一回事,在类似情况下确实会导致不一致的 ontology 错误。