您的示例并不依赖于封闭世界原则的利用。这取决于验证规则的引入owl:qualifiedCardinality
.
例如,让我们采用以下示例输入文件:
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix owl: <http://www.w3.org/2002/07/owl#>.
@prefix : <urn:x-so:ex#>.
:OtherClass a owl:Class .
:SuperClass a owl:Class .
:myProperty a rdf:Property
; rdfs:range :OtherClass
.
:ExampleClass rdfs:subClassOf :SuperClass
; rdfs:subClassOf [ a owl:Restriction
; owl:onProperty :myProperty
; owl:cardinality 1
# ; owl:onClass :OtherClass
# ; owl:qualifiedCardinality 1
]
.
:o0 a :OtherClass .
:o1 a :OtherClass .
:s0 rdf:type :ExampleClass
; :myProperty :o0
; :myProperty :o1
.
请注意注释掉的行和上面引入的公理。该本体符合 owl-1 标准,因此有其验证规则。在下面的测试中没有验证错误,为什么?因为我们可以推断,例如,:o0 owl:sameAs :o1
这不会导致矛盾。
final Model baseModel = ModelFactory.createDefaultModel();
try( final InputStream in = this.getClass().getResourceAsStream("/so.ttl") ){
baseModel.read(in, null, "TTL");
}
final OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF, baseModel);
assertTrue(model.contains(s0, myProperty, o0));
assertTrue(model.contains(s0, myProperty, o1));
final ValidityReport report = model.validate();
assertTrue( report.isValid() );
然而,在下一个示例中,我们将证明如果我们引入:o0 owl:differentFrom :o1
,那么我们就得出一个矛盾:
final Model baseModel = ModelFactory.createDefaultModel();
try( final InputStream in = this.getClass().getResourceAsStream("/so.ttl") ){
baseModel.read(in, null, "TTL");
}
final OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF, baseModel);
model.add(o1, OWL.differentFrom, o0); // NOTE!!
assertTrue(model.contains(s0, myProperty, o0));
assertTrue(model.contains(s0, myProperty, o1));
final ValidityReport report = model.validate();
assertFalse( report.isValid() );
鉴于所演示的场景,我提出以下解决方案(按难度升序排列):
解决方案 1:具有 OWL 1 约束的开放世界
如果可能的话,用owl-1约束来表达你的本体,然后你可以利用现有的规则集进行验证。
解决方案 2:添加 OWL 2 的开放世界
这并不容易。看一眼etc/owl-fb.rules
in jena-core
你会注意到,支持一些通用的 owl 结构(最值得注意的是,基数)需要耶拿内置的发展 https://stackoverflow.com/questions/23268298/once-ive-written-a-builtin-what-do-i-need-to-do-to-make-the-reasoners-aware-of/23270901#23270901使规则表达式变得简单。如果这是您打算走的方向,我链接到有关内置的另一个答案。
以下规则来自jena-core
's etc/owl-fb.rules
文件来描述基数。它们不是完整的基数规则集。
[restriction5: (?C owl:onProperty ?P), (?C owl:cardinality ?X)
-> (?C owl:equivalentClass card(?P, ?X)),
(?C rdfs:subClassOf min(?P, ?X)),
(?C rdfs:subClassOf max(?P, ?X)) ]
[restriction4: (?C owl:onProperty ?P), (?C owl:maxCardinality ?X)
-> (?C owl:equivalentClass max(?P, ?X)) ]
[validationMaxN: (?v rb:validation on()), (?C rdfs:subClassOf max(?P, ?N)) greaterThan(?N, 1) (?P rdf:type owl:DatatypeProperty) ->
[max2b: (?X rb:violation error('too many values', 'Too many values on max-N property (prop, class)', ?P, ?C))
<- (?X rdf:type ?C), countLiteralValues(?X, ?P, ?M), lessThan(?N, ?M) ] ]
restriction5
简单地根据最小和最大基数定义基数(min
and max
在这个例子中是函子)。validationMaxN
是显示如何识别违规的特定规则(对于 N > 1)。它委托给CountLiteralValues http://grepcode.com/file/repo1.maven.org/maven2/org.apache.jena/jena-core/2.11.2/com/hp/hpl/jena/reasoner/rulesys/builtins/CountLiteralValues.java#CountLiteralValues内置用于识别该属性存在的绑定数量。
如果您愿意介绍一个CountQualifiedValues
内置,那么您可以定义一组类似于以下的规则来引入新的公理:
[restriction4: (?C owl:onProperty ?P), (?C owl:maxQualifiedCardinality ?X), (?C owl:onClass ?Y)
-> (?C owl:equivalentClass max(?P, ?X, ?Y)) ]
[validationMaxN: (?v rb:validation on()), (?C rdfs:subClassOf max(?P, ?N, ?Y)) greaterThan(?N, 1) (?P rdf:type owl:ObjectProperty) ->
[max2b: (?X rb:violation error('too many values', 'Too many values on max-QN property (prop, class, qclass)', ?P, ?C, ?Y))
<- (?X rdf:type ?C), countQualifiedValues(?X, ?P, ?Y, ?M), lessThan(?N, ?M) ] ]
解决方案 3:添加 OWL 2 的封闭世界
这实际上与解决方案 2 并没有什么不同。但是,您将尝试定义选择OWL 结构的语义,这是一个不平凡的问题。您可以引入一些验证规则(阅读etc/owl-fb.rules
获取示例)来捕获您特定的封闭世界假设。如果您强制要求它们仅在以下情况下运行(?v rb:validation on())
,那么您可以确保在执行验证时仅假设一个封闭世界。
边讨论
下面是 owl 1 中表达的基数限制的示例。它与上面输入文件中的相同。这表达为TURTLE
语法并且很容易转换为RDF/XML
或任何其他有效的RDF
序列化。
:ExampleClass rdfs:subClassOf :SuperClass
; rdfs:subClassOf [ a owl:Restriction
; owl:onProperty :myProperty
; owl:cardinality 1
]
.
这对限制在语义上并不完全等同于owl:qualifiedCardinality
,但是,如果您有能力修改域模型,则通常可以解决它。
例如,owl:qualifiedCardinality
很高兴能说出这样的话:People :haveBodyPart exactly 2 :Eyes
。例如,OWL 1 解决方法可以是创建一个:haveEye rdfs:subPropertyOf :haveBodyPart
然后说:People :haveEye exactly 2
(没有合格的基数限制)