【问题标题】:graphdb owl-max cardinality restriction not workinggraphdb owl-max 基数限制不起作用
【发布时间】:2019-01-20 16:36:22
【问题描述】:

我可以根据我的本体中定义的基数规则来限制在 graphdb 中插入数据吗?

我在带有“owl-max”规则集的 graphdb 存储库中加载了以下本体。基于讨论here。我试图限制一个人只能拥有一个“年龄”财产。

@prefix :      <http://stackoverflow.com/q/24188632/1281433/people-have-exactly-one-age#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

:Person  a               owl:Class ;
        rdfs:subClassOf  [ a                owl:Restriction ;
                           owl:cardinality  "1"^^xsd:nonNegativeInteger ;
                           owl:onProperty   :hasAge
                         ] .

<http://stackoverflow.com/q/24188632/1281433/people-have-exactly-one-age>
        a       owl:Ontology .

:hasAge  a      owl:DatatypeProperty .

我现在插入如下人员记录

prefix :      <http://stackoverflow.com/q/24188632/1281433/people-have-exactly-one-age#>
prefix data: <http://data.example.com/>

Insert DATA {
    data:dow a :Person ;
               :hasAge 26 .
}

下次我为那个人插入更新的年龄时,

Insert DATA {
    data:dow :hasAge 27 .
}

我预计 27 岁的三倍会覆盖 26 岁的三倍,否则我会收到插入错误。然而,这两个年龄都是为这个人存储的。

data:dow a <http://stackoverflow.com/q/24188632/1281433/people-have-exactly-one-age#Person> ;
    <http://stackoverflow.com/q/24188632/1281433/people-have-exactly-one-age#hasAge> "26"^^xsd:integer , "27"^^xsd:integer .

【问题讨论】:

  • 这不是一般最大基数的工作方式。在 OWL 中没有这样的 constraint 概念,例如数据库。 OWL 用于推理。另一方面,对于默认情况下彼此不同的文字,您的情况应该导致逻辑不一致。您是否在存储库中启用了check-for-inconsistency param
  • 嗨@AKSW,我在一个新的存储库中启用了检查不一致,并尝试了本体和具有不同值的“年龄”数据属性的多个插入。但是在插入语句期间仍然没有错误。
  • 好的,所以问题是OWL max配置文件中是否存在不一致规则。根据this,答案似乎是“不”。但根据here,它遵循 OWL RL 语义进行不一致检查,但我猜它不适用于 owl-max 配置文件。能否尝试为属性年龄的不一致检查添加自定义规则?

标签: owl graphdb


【解决方案1】:

免责声明:这并不是一个正确或正确的答案,我只是使用它,因为评论中的格式很奇怪。

不确定owl-max 配置文件是否支持您在此处需要的不一致规则。作为一种解决方法,您至少可以尝试添加自定义规则:

PREFIX sys: <http://www.ontotext.com/owlim/system#>
INSERT DATA {
    <_:custom> sys:addRuleset
        '''Prefices { 
                    x : http://stackoverflow.com/q/24188632/1281433/people-have-exactly-one-age#
           }
           Axioms {}
           Rules
           {
           Consistency: max_one_age_value
              a <x:hasAge> b
              a <x:hasAge> c [Constraint b != c]
              -----------------------
           }'''
}

【讨论】:

  • 我尝试了这个自定义规则,但是在为一个人插入多个“年龄”时仍然没有错误。我想我的解决方法是在添加新记录之前手动删除用户的所有“年龄”数据。
  • 是的,这确实可以通过DELETE { a b c } INSERT { x y z } WHERE { ... } 查询实现。但奇怪的是它不起作用。添加后您是否也更改为自定义规则集?我想必须通过INSERT DATA { _:b sys:defaultRuleset "custom" } 设置默认规则集 - 我稍后会在我的计算机上尝试它,可能我在这里做错了。
  • @TraceLog 好的,我知道为什么它不起作用。由于历史原因,Prefices 部分中的 URL 必须在没有括号的情况下定义......现在它可以工作了,我在本地检查了它。你能确认一下吗?
  • 感谢@AKSW,您对自定义规则的最新更改并将默认规则集设置为 custom ,它可以工作。尝试插入不一致的数据时出现错误。令人失望的是,graphdb owl-max 不包含此规则并且令人困惑 documentation
【解决方案2】:

感谢@aksw 的出色回答。根据http://graphdb.ontotext.com/documentation/standard/reasoning.html#predefined-rulesets,owl-max 和 owl-rl 应该按照要求做。

我想补充一点:@trace-log,SPARQL 中没有隐式的“覆盖”操作,你使用什么规则集都没有关系。您必须使用 DELETE...INSERT... 语句以您描述的方式更新三元组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2015-12-04
    • 2022-01-01
    • 2018-05-04
    相关资源
    最近更新 更多