Определение свойства онтологии в Protégé-OWL / SWRL

Мне нужно реализовать OWL-онтологию в Protégé, которая содержит два класса: s1 и s2, оба являются экземплярами класса System. Эти два класса связаны классом подключения s1_s2, который содержит свойство omega. Это свойство должно иметь стоимость в соответствии со следующим законом:

omega = 1 * s1.complete

Как я могу реализовать это в Protégé, чтобы в будущем использовать в SWRL-правиле?

фрагмент диаграммы классов со связью между классами


person Mike B.    schedule 01.02.2014    source источник


Ответы (1)


В общем, вы должны начать с определения классов и свойств, которые вам нужны:

классы

свойства объекта

свойства типа данных

На этом этапе вы можете добавить некоторые аксиомы, которые определяют, как системы должны взаимодействовать, как работают свойства и т. Д. Например, вы можете объявлять домены и диапазоны для своих свойств. Вот домен и диапазон свойства hasS2:

домен и диапазон hasS2

Вы также можете сказать, что каждая InterSystem имеет ровно по одному ассоциированному элементу S1 и S2:

hasS1 ровно 1 S1…

Чтобы ввести математические ограничения, вам действительно понадобится SWRL; вы не сможете наложить ограничение, используя другие аксиомы OWL. Правило, которое вам нужно, выглядит следующим образом. Если вы объявляете домены и диапазоны в своих предикатах, вам не понадобятся все предикаты типов, которые появляются в этом правиле, поскольку они могут быть выведены из использования свойства.

S1 (? S1) InterSystem (? I) hasS1 (? I,? S1) hasComplete (? S1,? Complete) умножить (? Omega, 1,? Complete) hasOmega (? I,? Omega)

Умножение здесь на самом деле кажется излишним, поскольку вы умножаете на 1, поэтому omega = alpha, и в этом случае заголовок этого правила может быть просто hasOmega (? I,? Alpha). В Protégé правило выглядит так:

правило

(В той версии Protégé, которую я использую (не последней), мне пришлось выбрать Window> Create New Tab, чтобы создать вкладку Rules, а затем Window> Views> Ontology Views> Rules, чтобы добавить список правил в интерфейс.)

Сериализация Turtle RDF-представления этой онтологии OWL (которую вы можете сохранить и загрузить в Protégé):

@prefix :      <http://stackoverflow.com/q/21499126/1281433/systems#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix swrl:  <http://www.w3.org/2003/11/swrl#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix swrlb: <http://www.w3.org/2003/11/swrlb#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<urn:swrl#s1>  a  swrl:Variable .

:hasComplete  a  owl:DatatypeProperty .

[ a          swrl:Imp ;
  swrl:body  [ a          swrl:AtomList ;
               rdf:first  [ a                    swrl:ClassAtom ;
                            swrl:argument1       <urn:swrl#i> ;
                            swrl:classPredicate  :InterSystem
                          ] ;
               rdf:rest   [ a          swrl:AtomList ;
                            rdf:first  [ a                    swrl:ClassAtom ;
                                         swrl:argument1       <urn:swrl#s1> ;
                                         swrl:classPredicate  :S1
                                       ] ;
                            rdf:rest   [ a          swrl:AtomList ;
                                         rdf:first  [ a                       swrl:IndividualPropertyAtom ;
                                                      swrl:argument1          <urn:swrl#i> ;
                                                      swrl:argument2          <urn:swrl#s1> ;
                                                      swrl:propertyPredicate  :hasS1
                                                    ] ;
                                         rdf:rest   [ a          swrl:AtomList ;
                                                      rdf:first  [ a                       swrl:DatavaluedPropertyAtom ;
                                                                   swrl:argument1          <urn:swrl#s1> ;
                                                                   swrl:argument2          <urn:swrl#complete> ;
                                                                   swrl:propertyPredicate  :hasComplete
                                                                 ] ;
                                                      rdf:rest   [ a          swrl:AtomList ;
                                                                   rdf:first  [ a               swrl:BuiltinAtom ;
                                                                                swrl:arguments  [ a          rdf:List ;
                                                                                                  rdf:first  <urn:swrl#omega> ;
                                                                                                  rdf:rest   [ a          rdf:List ;
                                                                                                               rdf:first  1 ;
                                                                                                               rdf:rest   ( <urn:swrl#complete> )
                                                                                                             ]
                                                                                                ] ;
                                                                                swrl:builtin    swrlb:multiply
                                                                              ] ;
                                                                   rdf:rest   ()

                                                                 ]
                                                    ]
                                       ]
                          ]
             ] ;
  swrl:head  [ a          swrl:AtomList ;
               rdf:first  [ a                       swrl:DatavaluedPropertyAtom ;
                            swrl:argument1          <urn:swrl#i> ;
                            swrl:argument2          <urn:swrl#omega> ;
                            swrl:propertyPredicate  :hasOmega
                          ] ;
               rdf:rest   ()

             ]
] .

:S2     a                owl:Class ;
        rdfs:subClassOf  :System .

<urn:swrl#omega>  a  swrl:Variable .

:S1     a                owl:Class ;
        rdfs:subClassOf  :System .

:InterSystem  a          owl:Class ;
        rdfs:subClassOf  [ a                         owl:Restriction ;
                           owl:onClass               :S1 ;
                           owl:onProperty            :hasS1 ;
                           owl:qualifiedCardinality  "1"^^xsd:nonNegativeInteger
                         ] ;
        rdfs:subClassOf  [ a                         owl:Restriction ;
                           owl:onClass               :S2 ;
                           owl:onProperty            :hasS2 ;
                           owl:qualifiedCardinality  "1"^^xsd:nonNegativeInteger
                         ] .

<urn:swrl#complete>  a  swrl:Variable .

<http://stackoverflow.com/q/21499126/1281433/systems>
        a       owl:Ontology .

:hasS2  a       owl:ObjectProperty .

:hasOmega  a    owl:DatatypeProperty .

:System  a      owl:Class .

:hasS1  a       owl:ObjectProperty .

<urn:swrl#i>  a  swrl:Variable .

Это хорошее начало, но стоит посмотреть, как все это работает. Чтобы увидеть место, где могут быть применены правила, нам понадобятся некоторые данные экземпляра и аргумент. Вы упомянули, что вы можете использовать Pellet из Protégé, так что мы все настроены на это. Для некоторых данных экземпляра давайте создадим и InterSystem, его S1 и присвоим полное значение S1.

межсистема

the s1

Вам нужно будет выбрать Reasoner в меню Reasoner, а затем выбрать Reasoner> Start Reasoner. На этом этапе вы можете запустить DL-запрос для «hasOmega value 42», чтобы подтвердить, что у человека есть желаемое свойство (убедитесь, что вы установили флажок «Отдельные лица» справа):

введите описание изображения здесь

Если вы перейдете к межсистемному отдельному пользователю, вы, вероятно, не увидите предполагаемое значение. Чтобы показать это, перейдите в Reasoner> Configure… и отметьте опцию Data Property Assertions:

введите описание изображения здесь

После этого вам может потребоваться перезапустить средство рассуждений (Reasoner> None; Reasoner> Pellet; Reasoner> Start Reasoner), но после этого вы сможете увидеть предполагаемые значения:

утверждение предполагаемого свойства данных

person Joshua Taylor    schedule 01.02.2014
comment
Дорогой Джошуа. Спасибо за ответ. Я загрузил сериализацию вашей реализации, но не могу найти, как именно запустить правило в Protégé 4.x? Я создал вкладку Rule, загрузил в нее представление правил, там я вижу ваше правило: «InterSystem (? I), S1 (? S1), hasS1 (? I,? S1), hasComplete (? S1,? Complete) , multiply (? omega, 1,? complete) - ›hasOmega (? i,? omega)», я переключился на модуль рассуждений Pellet и запустил модуль рассуждений, но я все еще не вижу результатов выполнения правила. Подскажите, пожалуйста, где мне посмотреть результат. Спасибо. - person Mike B.; 01.02.2014
comment
@Mike. Вы можете проверить, что вывод выполняется с помощью запроса DL или (после включения параметра конфигурации) проверки личности. Я обновил свой ответ, чтобы показать, как это сделать. - person Joshua Taylor; 01.02.2014
comment
Спасибо за подробное объяснение. Я пытался реализовать подобное ограничение / правило «hasS1 точно 1 S1», но когда я пишу: «ровно 1 * System.complete» в диапазоне свойства omega, я получаю следующее сообщение об ошибке: «Ошибка: сообщение о недопустимом символе после». Что с этим не так? Почему это не позволяет мне определить это предположение. Все, что мне нужно, - это присвоить конкретное значение свойству экземпляра класса на основе значения свойства из конкретного экземпляра. Это все. - person Mike B.; 02.02.2014
comment
@Mike Я не уверен, что вы имеете в виду, используя в качестве диапазона ровно 1 * System.complete. Диапазон свойства объекта должен быть выражением класса, ровно 1 * System.complete, конечно же, не так. Что вы пытаетесь выразить? - person Joshua Taylor; 03.02.2014
comment
Собственно, в своей модели я пытаюсь выразить случай, когда свойство получит значение свойства другого экземпляра класса. Например. у нас есть две системы рангов: S1 и S2. Теперь мы хотим рассчитать общий / средний рейтинг элемента (S1_S2) по формуле 0,5 * S1.rank + 0,5 * S2.rank. Для этого мне нужно знать, как получить значение свойства из класса S1, умножить его на 0,5 и сохранить в свойстве S1_S2.rank. В классических языках программирования (Java / C # / Ruby…) такая задача тривиальна, но как это реализовать в мире Protege-OWL / SWRL? - person Mike B.; 04.02.2014
comment
Мне это нужно для реализации рассуждений на основе SWRL / Pellet, я уже написал версию на Ruby, теперь мне нужно реализовать то же самое в Protege-OWL / SWRL. Спасибо. - person Mike B.; 04.02.2014
comment
Классы @Mike не имеют свойств; люди делают. Я не понимаю, что вы имеете в виду под S1.rank или что вы имеете в виду, говоря о том, как получить значение свойства из класса S1. S1 - класс; у него нет свойств; лица типа S1 могут иметь свойства. Предположим, у вас есть данные вроде: x rdf:type S1 . x hasRank .34 . y rdf:type S2 . y hasRank .78 . z rdf:type S1_S2 . z hasS1 x . z hasS2 y. Тогда правило, подобное описанному мною, вычислит значение свойства для z. - person Joshua Taylor; 04.02.2014
comment
Спасибо за объяснение, теперь все намного яснее. У меня вопрос по недвижимости. Я определил свойства объекта, классы и индивидов. Когда я создавал индивидов, я добавлял свойства вручную, но когда я запускал логику рассуждений, я обратил внимание, что теперь у моих индивидов есть повторяющиеся свойства - одно, возникающее при ручном заполнении, а другое автоматически с меткой «выведено». Мой вопрос: должен ли я добавлять свойства вручную для отдельных лиц или это указатель аргумента, он добавляет свойства автоматически в соответствии с определением? Спасибо. - person Mike B.; 08.02.2014