传递 属性 的等效 class
Equivalent class for transitive property
我有一个对象 属性 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
)
]
] .
但是当我 运行 推理器时,我将所有课程列为 class Term
的实例,Knowledge_Area
:
也一样
如果我不使用 or
并将该课程设置为仅等同于 partOf some Term
或 partOf some Knowledge_Area
(分别且一次一个)我不明白问题。
有没有一种方法可以让我说出我在开头解释的内容,而不是将课程推断为 Term
类型?
Here there is a minimal example:
@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
传递角色的语义是 if (x, y) \in R
and (y, z) \in R
then (x, z) \in R
。根据你的 ontology 你有:
(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
严格来说,在我的示例 ontology 中,您不需要 partOf
属性。我只是为了概念上的清晰而添加它。此外,在我的示例中 ontology 不需要传递属性。
我有一个对象 属性 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
)
]
] .
但是当我 运行 推理器时,我将所有课程列为 class Term
的实例,Knowledge_Area
:
如果我不使用 or
并将该课程设置为仅等同于 partOf some Term
或 partOf some Knowledge_Area
(分别且一次一个)我不明白问题。
有没有一种方法可以让我说出我在开头解释的内容,而不是将课程推断为 Term
类型?
Here there is a minimal example:
@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
传递角色的语义是 if (x, y) \in R
and (y, z) \in R
then (x, z) \in R
。根据你的 ontology 你有:
(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
严格来说,在我的示例 ontology 中,您不需要 partOf
属性。我只是为了概念上的清晰而添加它。此外,在我的示例中 ontology 不需要传递属性。