ограничение кардинальности graphdb owl-max не работает - PullRequest
0 голосов
/ 20 января 2019

Могу ли я ограничить вставку данных в graphdb на основе правил кардинальности, определенных в моей онтологии.

Я загрузил следующую онтологию в репозиторий graphdb с набором правил "owl-max". На основе обсуждения здесь . Я пытаюсь ограничить то, что у человека может быть только одно «возрастное» свойство.

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

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Спасибо @aksw за отличные ответы.Согласно http://graphdb.ontotext.com/documentation/standard/reasoning.html#predefined-rulesets, owl-max и owl-rl должны делать то, что было задано.

Я хочу добавить пояснение: @ trace-log, в SPARQL нет неявной операции «перезаписи»,и не имеет значения, какой набор правил вы используете.Вы должны использовать оператор DELETE ... INSERT ..., чтобы обновить тройки так, как вы описываете.

0 голосов
/ 21 января 2019

заявление об отказе от ответственности: это не означает, что это правильный или неправильный ответ, я просто использовал его, потому что форматирование в комментариях странно.

Не уверен, поддерживает ли профиль 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]
              -----------------------
           }'''
}
...