graphdb owl最大基数限制不起作用

graphdb owl最大基数限制不起作用,owl,graphdb,Owl,Graphdb,我可以根据本体中定义的基数规则限制graphdb中数据的插入吗 我使用“owl max”规则集将以下本体加载到graphdb存储库中。基于讨论。我试图限制一个人只能拥有一个“年龄”财产 @prefix : <http://stackoverflow.com/q/24188632/1281433/people-have-exactly-one-age#> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @pr

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

我使用“owl max”规则集将以下本体加载到graphdb存储库中。基于讨论。我试图限制一个人只能拥有一个“年龄”财产

@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 .
我希望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 .
数据:道指a;
“26”^^xsd:integer,“27”^^xsd:integer。

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

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

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]
              -----------------------
           }'''
}
前缀sys: 插入数据{ sys:addRuleset ''前缀{ x:http://stackoverflow.com/q/24188632/1281433/people-have-exactly-one-age# } 公理{} 规则 { 一致性:最大值 a b a c[约束b!=c] ----------------------- }''' }
感谢@aksw提供了出色的答案。根据,猫头鹰max和猫头鹰rl应该按要求做


我想补充一点说明:@trace log,SPARQL中没有隐式的“覆盖”操作,您使用的规则集也不重要。您必须使用删除…插入。。。语句以您描述的方式更新三元组。

一般来说,最大基数不是这样工作的。在OWL中,没有像数据库这样的约束概念。OWL用于推理。另一方面,对于默认情况下彼此不同的文本,您的案例应该导致逻辑不一致。您在存储库中启用了吗?您好@AKSW,我在一个新的存储库中启用了不一致性检查,并尝试了本体和“age”dataproperty具有不同值的多个插入。但是,在insert语句中仍然没有错误。确定,所以问题是OWL max配置文件中是否存在不一致规则。根据调查,答案似乎是“不”。但据我所知,它遵循OWL RL语义进行不一致性检查,但我猜它不适用于OWL max概要文件。您可以尝试添加一个自定义规则来检查属性年龄的不一致性吗?我尝试了这个自定义规则,但是在为一个人插入多个“年龄”时仍然没有错误。我想我的工作是在添加新记录之前手动删除用户的所有“年龄”数据。是的,这确实可以通过
delete{abc}INSERT{xyz}其中{…}
query实现。但奇怪的是它不起作用。添加后是否也更改为自定义规则集?我想必须通过
插入数据{{ub sys:defaultRuleset“custom”}
设置默认规则集-我稍后会在我的计算机上尝试,可能是我在这里做错了。@TraceLog好的,我找到了它不起作用的原因。由于历史原因,
Prefices
部分中的URL必须在没有括号的情况下定义……现在它可以工作了,我在本地检查了它。您能确认吗?谢谢@AKSW,通过您对自定义规则的最新更改并将默认规则集设置为custom,它可以正常工作。尝试插入不一致的数据时出错。但令人失望的是,graphdb
owl max
不包含此规则,并且具有令人困惑的特性
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 .
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]
              -----------------------
           }'''
}