【问题标题】:Jena Rule for Validation af a Ontology本体验证的耶拿规则
【发布时间】:2014-08-21 09:33:58
【问题描述】:

我想验证一个本体,如果有任何不正确的地方就抛出一个错误。

我要做的最验证看起来像这样: 我有这样的课:

   <owl:Class rdf:about="&schema;ExampleClass">
        <rdfs:subClassOf rdf:resource="&schema;SuperClass"/>
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="&schema;myProperty"/>
                <owl:onClass rdf:resource="&schema;OtherClass"/>
                <owl:qualifiedCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:qualifiedCardinality>
            </owl:Restriction>
        </rdfs:subClassOf>
    </owl:Class>

(有趣的部分是第二个 subClassOf。) 在 Protege 中,这意味着 ExampleClass is subClass of myProperty exactly 1 OtherClass

所以我想验证是否有一个 myProperty 具有值:OtherClass 类型的个体。

是否可以验证这样的规则?如果有一个规则可以为所有使用这种建模的类(可能还有至少 1 个、正好 2 个......)执行此操作,那将是完美的。

另一个问题是:是否有一个现成的封闭世界推理器正在为我做这件事?

【问题讨论】:

    标签: rdf jena owl jena-rules


    【解决方案1】:

    您的示例不依赖于对封闭世界原则的利用。这取决于对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 的开放世界

    这并不容易。看一下jena-core 中的etc/owl-fb.rules,您会注意到对一些通用owl 构造(最值得注意的是基数)的支持需要development of Jena Builtin 来简化规则表达式。如果这是您打算走的方向,我链接到另一个关于内置函数的答案。

    以下规则来自jena-coreetc/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 仅根据最小和最大基数定义基数(本例中的minmax 是函子)。 validationMaxN 是显示如何识别违规的特定规则(对于 N > 1)。它委托给 CountLiteralValues 内置函数来识别该属性存在的绑定数量。

    如果您愿意引入CountQualifiedValues Builtin,那么您可以定义一组类似于以下的规则来引入新的公理:

    [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 构造定义 alternative 语义,这是一个不平凡的问题。您可以引入一些验证规则(阅读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(没有合格基数限制)

    【讨论】:

    • Jena这里提供的验证不是基于OWL语义的吗?因此,如果xmin 1 p 的一个元素,则如果本体不包含三元组x p y,则它不是矛盾,但如果x p y 本身就是矛盾的,则只有矛盾。我的印象是 OP 试图做一些更像是对数据库的完整性约束。
    • 是的,现有OWL规则文件中的验证规则是基于OWL语义的。提供替代语义(解决方案 3),将 OWL 解释为完整性约束,将是困难的,但并非不可能。一些工具(如 C&P 的 Stardog)实际上为此目的提供了另一种语义。然而,在耶拿,重新解释具有不同语义的现有三元组将需要开发人员/用户设计一个替代语义规则集。即:min 1 p 要求在推理闭包中存在三元组x p y,否则在封闭世界下违反
    • 是的,后者是我在回答中的目标。
    • 很好的答案 - 现在我必须看看哪种解决方案对我来说是最好的。对于可用性问题,应该使用 Protege 创建本体。您能否确认这不包括解决方案 1?
    • 您可以在 Protege 中构建 OWL 1 和 OWL 2 本体。它允许您使用的推理器可能并非对所有 OWL 2 公理都敏感。如果您以后想在 Jena 中使用此本体,坚持 OWL 1 公理将是最安全的方法。这使得解决方案 1 可以正常工作。
    【解决方案2】:

    听起来您正在尝试根据一些 OWL 公理检查一些完整性约束,但重要的是要注意 OWL 是基于开放世界假设的。这意味着即使您有:

    人 &sqsubseteq; ∃hasParent.Person

    这表示每个人(至少)有一个 hasParent 属性的值和另一个 Person 个体的值,您仍然可以拥有一个完全不包含任何 hasParent 断言的一致本体!因此,您正在寻找的那种“验证”实际上更多是关于一个封闭的世界和完整的解释。

    我可能不会使用基于规则的方法来解决这个问题,而是使用一些 SPARQL 查询来检查不满足我们期望他们满足的事情的个人。例如,在这种情况下,您可以编写一个通用规则来查找作为限制实例的个体,然后您可以检查是否可以在数据中找到与限制“匹配”的三元组。

    对于这种特殊情况,您可以通过以下方式找到 (一些) (myProperty exact 1 OtherClass) 实例(以及一般的合格基数):

    ?instance a [ owl:onProperty ?property ;
                  owl:onClass ?class ;
                  owl:qualifiedCardinality ?cardinality ] .
    

    当然,如果只能推断某个人是该类的一个实例,那么该模式将找不到它,但我们假设您正在使用一个封闭的-世界和完整的数据,所以这样的东西应该可以工作。 (“类似的东西”可能包括?instance a/rdfs:subClassOf* [ ... ]。)一旦你得到它,你就可以编写一个检查数据是否“匹配”的子查询:

    select ?instance ?property ?class (count(?value) as ?actualCardinality) where {
      ?instance ?property ?value .
      ?value a ?class
    }
    group by ?instance ?property ?class 
    

    然后您可以结合这些来识别 ?actualCardinality 与 ?cardinality 不匹配的个人:

    select ?instance
           ?property
           ?class
           ?cardinality
           (count(?value) as ?actualCardinality)
    where {
      ?instance a [ owl:onProperty ?property ;
                    owl:onClass ?class ;
                    owl:qualifiedCardinality ?cardinality ] .
    
      ?instance ?property ?value .
      ?value a ?class
    }
    group by ?instance ?property ?class ?cardinality
    having ( ?cardinality != ?actualCardinality )
    

    我还没有测试过这些,所以可能有错别字,而且你还没有提供完整的数据,所以我也无法对此进行测试,但这条一般线路中的一些东西应该是可行的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多