Определение свойства онтологии в Protégé-OWL / SWRL
Мне нужно реализовать OTL-онтологию в Protégé, которая содержит два класса: s1 и s2, оба являются экземплярами класса System. Эти два класса связаны классом соединения s1_s2, который содержит свойство omega. Это свойство должно принимать значение в соответствии со следующим законом:
omega = 1 * s1.complete
Как я могу реализовать это в Protégé, чтобы я мог использовать его в SWRL-правиле в будущем?
1 ответ
В общем, вы должны начать с определения классов и свойств, которые вам нужны:
На этом этапе вы можете добавить некоторые аксиомы, которые определяют, как системы должны взаимодействовать, как работают свойства и т. Д. Например, вы можете объявить домены и диапазоны в ваших свойствах. Вот домен и диапазон свойства hasS2:
Вы также можете сказать, что у каждой InterSystem есть ровно один ассоциированный S1 и S2:
Чтобы вставить математические ограничения, вам действительно понадобится 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.
Вам нужно будет выбрать "Пеллетный разум" в меню "Разумник", а затем выбрать "Разумник"> "Запустить разум". На этом этапе вы могли бы выполнить запрос DL для " значения hasOmega 42", чтобы подтвердить, что у человека есть желаемое свойство (убедитесь, что вы отметили флажок "Отдельные лица" справа):
Если вы перейдете к межсистемному человеку, вы, вероятно, не увидите выведенное значение. Чтобы показать это, перейдите к Reasoner > Configure… и отметьте опцию Data Property Assertions:
После этого вам может потребоваться перезапустить генератор (Reasoner > None; Reasoner > Pellet; Reasoner > Start Reasoner), но после этого вы сможете увидеть предполагаемые значения: