В общем, вы должны начать с определения классов и свойств, которые вам нужны:
![классы](https://i.stack.imgur.com/IpVlB.png)
![свойства объекта](https://i.stack.imgur.com/VQGaQ.png)
![свойства типа данных](https://i.stack.imgur.com/OHOcr.png)
На этом этапе вы можете добавить некоторые аксиомы, которые определяют, как системы должны взаимодействовать, как работают свойства и т. Д. Например, вы можете объявлять домены и диапазоны для своих свойств. Вот домен и диапазон свойства hasS2:
![домен и диапазон hasS2](https://i.stack.imgur.com/QHM23.png)
Вы также можете сказать, что каждая InterSystem имеет ровно по одному ассоциированному элементу S1 и S2:
![hasS1 ровно 1 S1…](https://i.stack.imgur.com/EjA7E.png)
Чтобы ввести математические ограничения, вам действительно понадобится 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é правило выглядит так:
![правило](https://i.stack.imgur.com/qZBke.png)
(В той версии 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.
![межсистема](https://i.stack.imgur.com/k1ynk.png)
![the s1](https://i.stack.imgur.com/8rktJ.png)
Вам нужно будет выбрать Reasoner в меню Reasoner, а затем выбрать Reasoner> Start Reasoner. На этом этапе вы можете запустить DL-запрос для «hasOmega value 42», чтобы подтвердить, что у человека есть желаемое свойство (убедитесь, что вы установили флажок «Отдельные лица» справа):
![введите описание изображения здесь](https://i.stack.imgur.com/ZbqsZ.png)
Если вы перейдете к межсистемному отдельному пользователю, вы, вероятно, не увидите предполагаемое значение. Чтобы показать это, перейдите в Reasoner> Configure… и отметьте опцию Data Property Assertions:
![введите описание изображения здесь](https://i.stack.imgur.com/9hcWn.png)
После этого вам может потребоваться перезапустить средство рассуждений (Reasoner> None; Reasoner> Pellet; Reasoner> Start Reasoner), но после этого вы сможете увидеть предполагаемые значения:
![утверждение предполагаемого свойства данных](https://i.stack.imgur.com/rMhUJ.png)
person
Joshua Taylor
schedule
01.02.2014