我可以根据本体中定义的基数规则来限制在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 .
答案 0 :(得分:3)
免责声明:这并不是一个正确也不正确的答案,我只是使用它,因为注释中的格式很奇怪。
不确定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]
-----------------------
}'''
}
答案 1 :(得分:0)
感谢@aksw提供了出色的答案。根据{{3}},owl-max和owl-rl应该按照要求进行操作。
我想添加一个说明:@ trace-log,SPARQL中没有隐式的“覆盖”操作,并且使用什么规则集都没有关系。您必须使用DELETE ... INSERT ...语句以您描述的方式更新三元组。