本体验证的耶拿规则

2024-03-08

我想验证本体并在有任何不正确的情况下抛出错误。

我要做的最多的验证如下所示: 我有一堂这样的课:

   <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>

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

因此,我想验证是否存在一个具有值的 myProperty:OtherClass 类型的个体。

是否可以验证这样的规则?如果有一条规则对使用此建模的所有类执行此操作(也许还至少有 1 个,正好 2 个,...),那就完美了

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


您的示例并不依赖于封闭世界原则的利用。这取决于验证规则的引入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(没有合格的基数限制)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

本体验证的耶拿规则 的相关文章

  • 如何开始使用 RDF? (特别是对于关系数据库开发人员?)

    我正在整理一个目录 目录本质上只是元数据 因此我没有使用数据库 而是使用 RDF 存储和 SPARQL 处理器来编译数据 我正处于模式匹配阶段 有趣的部分 因此 我想出了许多在 SPARQL 中定义起来很简单的模式 然后将该信息提供给使用该
  • Freebase 中所有标题/主题标题的文本文件

    我需要一个文本文件来包含 txt 文件中每个标题 每个主题的标题 每个项目的标题 每个标题都占一行 如果我已经下载了 freebase rdf 转储 我该如何执行此操作或进行此操作 如果可能 我还需要一个单独的文本文件 其中每个主题 项目的
  • 计算OWL本体中子类的深度

    我正在寻找一个 SPARQL 查询 它可以返回 OWL 层次结构中指定子类的位置 我研究了几个例子 但我能达到的最好结果是计算指定超类与其子类之间的相对路径 感谢约书亚 泰勒 https stackoverflow com a 230949
  • 猫头鹰的含义:有值吗?

    一个的含义是什么owl hasValue限制 以及它与owl allValuesFrom and owl someValuesFrom 在本体论中 我想写一个公理 每个拥有文凭的人都是有文化的 我该怎么写这个 不同类型的限制类别 考虑一个个
  • DatatypeProperty、ObjectProperty 和FunctionalProperty 之间有什么区别,什么时候应该使用它们?

    在编写本体时 有几种非常常用的类型 包括 数据类型属性 对象属性 功能特性 反函数性质 前三个看起来像是以一组特定的方式使用 但我发现我对它们的想法受到了我在 FOAF 中的使用方式的挑战 它们分别在什么时候应该使用或者什么时候不应该使用
  • 使用TDB2和OWL Reasoner配置fuseki

    这里是 fusioni jena 的新手 我设法让 fusioni 使用 tdb1 与 OWLFBRuleReasoner 一起运行没有问题 但无法使其与 tdb2 一起工作 http jena apache org 2016 tdb ht
  • 使用 Jena 解析 RDF 递归

    我正在尝试使用 Apache Jena 递归解析 RDF 文档 它由如下数据集组成
  • 禁用 apache.http.wire 调试日志

    我正在将 Travis CI 与我的 github 存储库 java 项目 一起使用 我的一项测试使用 SPARQL 和 Jena 从 Dbpedia 获取数据 它导致我在日志中将许多记录打印到 Travis 输出中 从而导致 Travis
  • protege 中的自反属性

    This https ufile io rcv9m是我用 protege 5 创建的本体 如果我做cl1 and cl2不相交 那么本体是不一致的 但是如果我取消选中is friend of反身性的 本体论不再不一致 我的本体有什么问题吗
  • 在现实世界应用中使用语义网络技术的示例[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 您正在开发使用 RDF OWL SPARQL 技术的 可能是商业的 产品吗 如果是这样 您能描述一下您的产品吗 O Reilly 的
  • RDF 文件转换为 Excel 可读格式

    我下载了 ttl 格式的 rdf 文件 我是 RDF 新手 我想看看是否可以以某种简单的 txt csv 格式获取数据 有谁知道如何做到这一点 RDF 有一个非常简单的数据模型 它只是subject predicate object 您可以
  • Jena PrefixMapping:当模型是从数据集中获取的命名模型时,基本命名空间缺失

    这是我用来加载的代码OntModel to a Dataset作为命名模型 然后我尝试检索PrefixMapping以两种不同的方式实现相同的目的 public static void loadDatasetwithNamedModels
  • sparql 主题的完整树

    例如 当我有一个人图时 例如约翰和约翰有工作地址 家庭地址 电话号码 关系等 是否有可能在不知道它是什么的情况下检索与 john 及其子类相关的所有内容 这样我就可以检索例如以下内容 John lt address lt house num
  • OWL 限制 - 定义仅包含具有特定属性值的属性的类

    我目前正在玩 OWL 尤其是有限制的情况 我正在尝试创建一个执行以下操作的查询 假设我有一个类 Cinema 它具有属性 movies 包含 Movie 类型的对象 Movie 类包含一个名为 genre 的属性 现在我想创建一个 Acti
  • 组图模式在 SPARQL 中如何工作

    首先 我不知道这是否真的称为组图模式 反正 请看看这个查询 select x y where x rdf type rs Recommendable union xd rs doesntexist y 有no rs doesntexist但
  • W3C 验证器无法处理 RDF/XML

    我正在尝试描述一个非常基本的地铁火车站地图 其中包含站点和时间 这个 RDF 到 Turtle 转换器 http rdf translator appspot com 可以解析我的 XML 但 W3C 验证器抛出 Error Your do
  • RDF、RDFa、微格式和微数据之间有什么关系

    我已经做了很多研究 但我无法理解这 3 者之间的确切关系 另外 既然 W3C 已经正式认可 RDFa 考虑到它与 Microdata 的功能等相匹配 您会推荐它而不是 Microdata 吗 我无法想象你会发现什么如此令人困惑讽刺 gt 编
  • rdf:seeAlso 和 rdfs:seeAlso 之间的区别

    有什么区别rdf seeAlso and rdfs seeAlso 当我可以使用时rdf seeAlso当我可以使用时rdfs seeAlso 你能举出一些例子吗 首先 请注意rdf and rdfs分别是常用于引用 RDF 语法和 RDF
  • 为什么 RDF 中对对象使用代码而不是字符串?

    例如 entity f06574 rdfs label Orioles 或者这样的格式 tt0268252 a Movie 在任一情况下 f06574 and tt0268252是代码 而不是实体或实例的实际字符串 原因之一可能是因为同一个
  • 将 SWRL 与 Jena 和 Pellet 结合使用

    我无法找到一些使用 SWRL 和 Jena 的简单代码示例 佩莱 或者至少使用 SWRL 我研究了 Pellet 文档中的一些示例 但没有关于使用 SWRL 的示例 网络上的大多数示例都不完整且令人困惑 我找到的唯一解决方案是使用 Jess

随机推荐