本体验证的耶拿规则

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 文件 我想将其导入到 tripplestore AllegroGraph 中 但在第一个文件中 我收到 SAX 解析器错误 指出存在无法识别的字符 删除有问题的行后 一切都很好 然后我尝试使用 W3C RDF 验证器和带有
  • sparql 主题的完整树

    例如 当我有一个人图时 例如约翰和约翰有工作地址 家庭地址 电话号码 关系等 是否有可能在不知道它是什么的情况下检索与 john 及其子类相关的所有内容 这样我就可以检索例如以下内容 John lt address lt house num
  • 获取地点的纬度和经度 dbpedia

    我想获取一个我已经知道其名称的地点的纬度和经度 PREFIX geo
  • uml 与 RDF 和 OWL 的组合关系

    我是 RDF 和 OWL 本体的初学者 我正在尝试将此图转换为 OWL 语法
  • 通过计算属性来推断 OWL 中的知识

    我有一个包含 Person 和 City 类的本体 人们前往城市旅行 这种旅行在 TravelTo 对象属性中表示 我想添加一个 WorldTraveler 类 如果人们去过两个或更多城市 那么他们就是世界旅行者 我怎样才能在我的本体中做到
  • 如何使用SPARQL计算有向图的最大度?

    我在两个单独的查询中计算了有向图中每个节点的入度和出度 SELECT s COUNT AS outdegree s p o GROUP BY s ORDER BY DESC outdegree SELECT o COUNT AS indeg
  • 从 RDF 节点拉出字符串

    在使用 Jena 的 SPARQL 查询时 我试图以更易读的格式获取数据 但是我不知道如何以正确的方式提取数据 就目前而言 输出是 http www w3 org TR 2003 PR owl guide 20031209 wine Sau
  • OWL ObjectProperty 在 Protégé 中作为注释加载

    我正在尝试加载ontology http www bbc co uk ontologies wildlife 2010 11 04 shtml在 Prot g 中 但未按预期进行处理 最有问题的是所有对象和数据属性都显示为注释而不是数据属性
  • 限制 Factforge sparql 端点使用的图表

    Using http www sparql org sparql html http www sparql org sparql html运行此查询 prefix oxprop
  • RDF、RDFa、微格式和微数据之间有什么关系

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

    我正在尝试将属性写入模型 然后查询它 我的代码的这一部分 String directory EMAILADDRESS create the dataset for the tdb store Dataset ds TDBFactory cr
  • djangonic 处理 rdf 的方法?

    我正在寻找 django 的 RDF 项目 但找不到任何活动的项目 这似乎是一个不错的http code google com p django rdf http code google com p django rdf 但最后一次提交是在
  • SPARQL 为缺失字段生成值

    我正在尝试编写一个 SELECT 它为我提供表中的所有值 我有可选值 我希望用标准值填充它们 如果它们不存在 这是我的代码 SELECT WHERE a nmo hasObject nm coin OPTIONAL a nmo hasAut
  • SPARQL (Jena) UPDATE 可以通过文字集合(而不是文字)进行参数化吗?

    我可以调用参数化的 SPARQL UPDATE 如 Jena 的ParameterizedSparqlString 将属性设置为多个 例如字面值 例如 我有 Set
  • SPARQL 查询在 Fuseki 中有效,但在 Jena TDB 中无效

    我将数据组织在多个图表中 保存三元组的图表很重要 数据结构很复杂 但可以简化如下 我的商店包含蛋糕 其中有不同蛋糕类型的层次结构 所有子类
  • 将 SWRL 与 Jena 和 Pellet 结合使用

    我无法找到一些使用 SWRL 和 Jena 的简单代码示例 佩莱 或者至少使用 SWRL 我研究了 Pellet 文档中的一些示例 但没有关于使用 SWRL 的示例 网络上的大多数示例都不完整且令人困惑 我找到的唯一解决方案是使用 Jess
  • 如何使用 SPARQL 从三元组中提取 rdf:about 或 rdf:ID 属性?

    一开始这似乎是一件微不足道的事情 但到目前为止我还没有设法使用 SPARQL 获取给定资源的唯一标识符 我的意思是给出的 例如 rdf Description rdf about http 然后是标识该资源的一些属性 我想要做的是首先找到这
  • 使用 SPARQL 查询的 UNION 和交集

    我正在将用户定义的查询转换为 SPARQL 例如 当用户说 abc 时 这意味着给我给定类型的所有具有名为 abc 属性的节点 作为其扩展 如果用户说 abc 或 pqr 和 lmn 我需要查找给定类型的某些属性为 abc 或 pqr 和
  • 在 dotNETRDF 中使用 SPARQL 列表 - 列表的交集

    我正在使用 dotNetRDF 并且很难理解如何使用提供的列表助手 目前我没有使用列表 只使用一个项目 如下所示 paramString SetParameter nickname g CreateLiteralNode nicknameS
  • 将任何 URI 类型的 CURI 字符串表示形式转换为真正的 CURI 或 IRI

    我有这样的三元组 其中对象是anyURICURIe 的类型化字符串表示形式 我想将对象构造为真正的 CURIe 或 IRI 的三元组 prefix source

随机推荐