Reasoner в Protege не работает с ограничениями/мощностями

В настоящее время я создаю/модифицирую большую онтологию. Поскольку у меня были проблемы с определением ограничений, я построил очень короткий пример: у меня есть класс EuropeanCountry и класс IslandCountry:

<owl:Class rdf:about="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#EuropeanCountry">
    <rdfs:subClassOf rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#Country"/>
</owl:Class>



<!-- http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#IslandCountry -->

<owl:Class rdf:about="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#IslandCountry">
    <rdfs:subClassOf rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#Country"/>
    <rdfs:subClassOf>
        <owl:Restriction>
            <owl:onProperty rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#borders"/>
            <owl:maxQualifiedCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger">0</owl:maxQualifiedCardinality>
            <owl:onClass rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#EuropeanCountry"/>
        </owl:Restriction>
    </rdfs:subClassOf>
</owl:Class>

Как видите, я установил ограничение «maxQualifiedCardinality» в Protege. Если я создам несколько лиц и (C1, C2 и Германия — EuropeanCountry, Island — IslandCountry) и свяжу их со свойством границы:

<owl:NamedIndividual rdf:about="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#Island">
    <rdf:type rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#IslandCountry"/>
    <borders rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#C1"/>
    <borders rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#C2"/>
    <borders rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#Germany"/>
</owl:NamedIndividual>

Я получаю сообщение об ошибке от Hermit Reasoner о том, что нельзя устанавливать 3 соседей на остров. Если я сейчас изменю строку

<owl:maxQualifiedCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger">1</owl:maxQualifiedCardinality>

до кардинальности 1. Я не получаю никаких ошибок, если устанавливаю трех соседей, как показано в примере. Может ли кто-нибудь объяснить это и, надеюсь, предоставить мне решение, как я могу написать ограничение, согласно которому один класс должен иметь x других классов (в этом случае, как написать, что у острова должно быть 2 соседа, а третий вызовет ошибку)?

Спасибо за вашу помощь и с уважением,

Танктоо

Изменить: теперь я добавил всех людей в AllDifferent:

<rdf:Description>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#AllDifferent"/>
    <owl:distinctMembers rdf:parseType="Collection">
        <rdf:Description rdf:about="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#C1"/>
        <rdf:Description rdf:about="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#C2"/>
        <rdf:Description rdf:about="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#Germany"/>
    </owl:distinctMembers>
</rdf:Description>

Теперь он работает с указанным выше ограничением, и рассудитель говорит мне, что мне не разрешено устанавливать 3 граничные страны, поскольку maxCardinality равно 1. Теперь я изменил свое ограничение на следующее:

<owl:Class rdf:about="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#IslandCountry">
    <rdfs:subClassOf rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#Country"/>
    <rdfs:subClassOf>
        <owl:Restriction>
            <owl:onProperty rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#borders"/>
            <owl:minQualifiedCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger">1</owl:minQualifiedCardinality>
            <owl:onClass rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#EuropeanCountry"/>
        </owl:Restriction>
    </rdfs:subClassOf>
    <rdfs:subClassOf>
        <owl:Restriction>
            <owl:onProperty rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#borders"/>
            <owl:maxQualifiedCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger">2</owl:maxQualifiedCardinality>
            <owl:onClass rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#EuropeanCountry"/>
        </owl:Restriction>
    </rdfs:subClassOf>
</owl:Class>

Теперь я ожидаю, что ризонер обнаружит ошибку, если я установлю менее 1 или более 2 соседей:

<owl:NamedIndividual rdf:about="http://www.semanticweb.org/tanktoo
/ontologies/2016/10/untitled-ontology-81#Island">
        <rdf:type rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#IslandCountry"/>
        <borders rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#C1"/>
        <borders rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#C2"/>
        <borders rdf:resource="http://www.semanticweb.org/tanktoo/ontologies/2016/10/untitled-ontology-81#Germany"/>
    </owl:NamedIndividual>

В этом случае рассудок обнаруживает ошибку, потому что есть 3 соседа. Если я сейчас удалю всех соседей так, чтобы остров граничил с 0 странами, то резонер не выдаст мне ошибку. Может кто-нибудь объяснить мне, почему?

Спасибо за вашу помощь :)


person tanktoo    schedule 22.11.2016    source источник
comment
Было бы хорошо увидеть полное исключение. Я не думаю, что HermiT выдаст/сможет выдать какую-либо ошибку с предоставленной вами онтологией.   -  person UninformedUser    schedule 23.11.2016
comment
Если я установлю для maxQualifiedCardinality значение 0, я получу сообщение (я не имею в виду сообщение об ошибке, что Hermit не работает), что мне не разрешено это делать.   -  person tanktoo    schedule 23.11.2016


Ответы (1)


Я получаю сообщение об ошибке от Hermit Reasoner о том, что нельзя устанавливать 3 соседей на остров

Если это то, что говорит инструмент, то это ошибка. Конечно, вы называете 3 названия граничащих стран. Но ничто не говорит о том, что это названия 3-х разных стран. Это может быть несколько названий одной и той же страны, например «Франция», «Французская Республика», «Французская Республика».

Поскольку у рассуждающего нет способа узнать, являются ли они именами одного и того же предмета или нет, он не может обнаружить несоответствие во втором случае. Однако в первом случае наличие по крайней мере имени для чего-либо означает, что существует строго больше нуля, поэтому имеет смысл обнаружить несоответствие.

Если вы хотите убедиться, что ризонер определяет, когда у страны более 2 соседей, вам нужно явно указать, что страны разные:

ex:C1  owl:differentFrom  ex:C2, ex:Germany .
ex:C2  owl:differentFrom  ex:Germany .

or:

[]  a  owl:AllDifferent;
    owl:members  ( ex:C1 ex:C2 ex:Germany ) .

В Protégé на вкладке Индивидуум можно указать, от чего отличается индивидуум.

person Antoine Zimmermann    schedule 22.11.2016
comment
Привет, спасибо за ваш ответ. Я ожидал, что все с другим именем будет другим (это потребовало бы от меня явного указания на то, что новый индивидуум отличается от всего существующего, что может потребовать много работы). Теперь у меня есть пример, работающий с AllDifferent и maxCardinality, но если я установлю дополнительную minCardinality 1 и изменю установку maxCardinality на 2, рассудок обнаружит случай, только если я установлю более 3 граничных стран. Если я не установлю границу страны, он ничего не обнаружит, почему? У вас есть идея? Спасибо! - person tanktoo; 23.11.2016
comment
В OWL нет предположения об уникальных именах, поэтому разные имена не означают разные сущности. - person UninformedUser; 23.11.2016
comment
Хорошо, спасибо за это ключевое слово. Поэтому мне придется добавить все свои экземпляры в AllDifferent. - person tanktoo; 23.11.2016
comment
tanktoo, нет противоречия в том, что у страны есть хотя бы один сосед, и в том, что соседнюю страну не называют. Я могу сказать, что у всех людей есть мама (Person SubClassOf hasParent min 1 Person), что я человек (me type Person). Скажете ли вы, что это непоследовательно, потому что я не назвал имя своей матери? Если ваша система должна быть в состоянии идентифицировать соседние страны, вам нужно полагаться на что-то еще, кроме согласованности. - person Antoine Zimmermann; 02.12.2016