Эквивалентный класс для переходного свойства
У меня есть свойство объекта partOf
который является переходным.
И я хочу сказать, что:
a partOf Year
затемa
этоTerm
b partOf Term
затемb
этоCourse
И одновременно:
a partOf Knowledge_Group
затемa
этоKnowledge_Area
b partOf Knowledge_Area
затемb
этоCourse
Для этого я использую это, чтобы сказать b partOf Term or Knowledge_Area
затем b
это Course
:
:Course rdf:type owl:Class ;
owl:equivalentClass [ rdf:type owl:Restriction ;
owl:onProperty :partOf ;
owl:someValuesFrom [ rdf:type owl:Class ;
owl:unionOf ( :Knowledge_Area
:Term
)
]
] .
Но когда я запускаю рассуждения, я получаю все курсы, перечисленные как экземпляры класса Term
и то же самое для Knowledge_Area
:
Если я не использую or
и установить, что курс эквивалентен только partOf some Term
или же partOf some Knowledge_Area
(отдельно и по одному) Я не понимаю эту проблему.
Есть ли способ, которым я могу сказать то, что я объяснил в начале, и не получить выводы, которые будут иметь тип Term
?
Здесь есть минимальный пример:
@prefix : <http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27> .
<http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27> rdf:type owl:Ontology .
#################################################################
# Object Properties
#################################################################
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#partOf
:partOf rdf:type owl:ObjectProperty ,
owl:TransitiveProperty .
#################################################################
# Classes
#################################################################
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#Course
:Course rdf:type owl:Class ;
owl:equivalentClass [ rdf:type owl:Restriction ;
owl:onProperty :partOf ;
owl:someValuesFrom [ rdf:type owl:Class ;
owl:unionOf ( :Knowledge_Area
:Term
)
]
] .
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#Knowledge_Area
:Knowledge_Area rdf:type owl:Class ;
owl:equivalentClass [ rdf:type owl:Restriction ;
owl:onProperty :partOf ;
owl:someValuesFrom :Knowledge_Group
] .
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#Knowledge_Group
:Knowledge_Group rdf:type owl:Class ;
owl:disjointWith :Year .
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#Term
:Term rdf:type owl:Class ;
owl:equivalentClass [ rdf:type owl:Restriction ;
owl:onProperty :partOf ;
owl:someValuesFrom :Year
] .
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#Year
:Year rdf:type owl:Class .
#################################################################
# Individuals
#################################################################
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#Course_1
:Course_1 rdf:type owl:NamedIndividual ;
:partOf :Knowledge_Area_1 ,
:Term_1 .
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#Knowledge_Area_1
:Knowledge_Area_1 rdf:type owl:NamedIndividual ;
:partOf :Knowledge_Group_1 .
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#Knowledge_Group_1
:Knowledge_Group_1 rdf:type owl:NamedIndividual ,
:Knowledge_Group .
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#Term_1
:Term_1 rdf:type owl:NamedIndividual ;
:partOf :Year_1 .
### http://www.semanticweb.org/lucia/ontologies/2018/5/untitled-ontology-27#Year_1
:Year_1 rdf:type owl:NamedIndividual ,
:Year .
### Generated by the OWL API (version 4.2.8.20170104-2310) https://github.com/owlcs/owlapi
1 ответ
Семантика транзитивных ролей, если (x, y) \in R
а также (y, z) \in R
затем (x, z) \in R
, Исходя из этого из вашей онтологии у вас есть что:
(1) Course_1 partOf Knowledge_Area_1 partOf Knowledge_Group_1
что значит Course_1 partOf Knowledge_Group_1
что эквивалентно Knowledge_Area
,
(2) Course_1 partOf Term_1 partOf partOf Year_1
что значит Course_1 partOf Year_1
что эквивалентно Term
,
следовательно Course_1
это Term
и Knowledge_Area
и с тех пор Course
эквивалентно Term or Knowledge_Area
, Course_1
также Course
что в значительной степени объясняет, почему Course_1
это Term
,
На мой взгляд, здесь нужно понимать, что вы на самом деле имеете дело с разными partOf
отношения, ни одного. Подсказка к этому факту заключается в том, что в разных контекстах вы хотите выводить информацию разного типа из вашего partOf
связь. Тип информации из отношений в OWL выводится в основном из ограничений домена и диапазона. Вот возможное решение вашей проблемы:
ObjectProperty: partOf
ObjectProperty: partOfKA
SubPropertyOf: partOf
Domain: Course
ObjectProperty: partOfKG
SubPropertyOf: partOf
Domain: Knowledge_Area
ObjectProperty: partOfTerm
SubPropertyOf: partOf
Domain: Course
ObjectProperty: partOfYear
SubPropertyOf: partOf
Domain: Term
Class: Course
Class: Knowledge_Area
Class: Knowledge_Group
DisjointWith: Year
Class: Term
Class: Year
DisjointWith: Knowledge_Group
Individual: Course_1
Facts:
partOfKA Knowledge_Area_1,
partOfTerm Term_1
Individual: Knowledge_Area_1
Facts: partOfKG Knowledge_Group_1
Individual: Knowledge_Group_1
Types: Knowledge_Group
Individual: Term_1
Facts: partOfYear Year_1
Individual: Year_1
Types: Year
Строго говоря, вам не нужно partOf
Свойство в моем примере онтологии. Я просто добавил это для концептуальной ясности. Более того, в моем примере онтологии нет необходимости в переходных свойствах.