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

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

omega = 1 * s1.complete

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

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

1 ответ

Решение

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

классы

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

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

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

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

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

имеет S1 ровно 1 S1…

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

S1(? S1) ∧ InterSystem(? I) ∧ имеет S1(? 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, чтобы добавить список Rules в интерфейс.)

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

@prefix :      <http://stackru.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://stackru.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.

межсистемный

S1

Вам нужно будет выбрать "Пеллетный разум" в меню "Разумник", а затем выбрать "Разумник"> "Запустить разум". На этом этапе вы могли бы выполнить запрос DL для " значения hasOmega 42", чтобы подтвердить, что у человека есть желаемое свойство (убедитесь, что вы отметили флажок "Отдельные лица" справа):

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

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

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

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

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

Другие вопросы по тегам