我正在尝试开发一个本体来代表课程,在这个课程中,学生必须参加6门选修课程(并且有很多课程可供选择)。
现在我有这个课程:
- Course
--- Elective (defined class by isElective = true && type = Course)
我所有可能的选修课程都是Course
类型的实例,数据属性isElective
设置为true。
但我想表示这6门选修课必须以某种方式进行,例如,学生需要在去年(Year
是一堂课)的课程中选修4门课程
我一直在考虑如何定义这个占位符/抽象类,正如我所读到的isn't possible and doesn't make sense,并且遇到了双关语,但我不知道它是否是我正在寻找的对
假设我定义了一个名为Course
的{{1}}的子类,然后是该类的4个实例,其中:
ElectivePlaceholder
然后,我希望有一种方法来表示学生选择ElectiveX instanceOf ElectivePlaceholder
Year5 instanceOf Year
ElectiveX isPartOf Year5
(AdvancedMaths
的实例,Elective
的实例,Course
设置为true)正如它isElective
。
我该怎么做?惩罚会有用吗?因为它允许一个对象被视为一个类和一个人。
更新
我试图建模的不是学生选择的,而是课程本身。
每个课程的个人对于学生必须参加多少个选修课程以及在哪些年份都有不同的要求。我需要以ElectiveX
个人或Curricula
个人的方式表示这一点(因此可以推断出Year
)。
现在:
Curricula
答案 0 :(得分:2)
Punning无法解决您的问题。 Punning允许您将Course
称为OWL类和OWL个体。
您可以通过如下定义本体来实现所需的结果:
ObjectProperty: hasCourse
Domain: Curricula
Range: Course
Class: Curricula
SubClassOf:
taughtInYear some xsd:integer,
hasCourse some Course
Class: CurriculaDifficult
SubClassOf:
Curricula,
hasCourse min 4 ElectiveCourse,
hasCourse max 9 Course
Class: CurriculaEasy
SubClassOf:
Curricula,
hasCourse min 1 ElectiveCourse,
hasCourse max 3 Course
Class: ElectiveCourse
SubClassOf: Course
DisjointWith: NonElectiveCourse
Class: NonElectiveCourse
SubClassOf: Course
DisjointWith: ElectiveCourse
Class: Course
Individual: AdvancedMaths
Types: ElectiveCourse
Individual: curriculaEasy2018
Types: CurriculaEasy
Facts:
taughtInYear 2018,
hasCourse someCourseA,
hasCourse someCourseB,
hasCourse someElectiveCourseA
Class Student:
SubClassOf: takeCurricula some Curricula
Individual: student123
Types: Student
Facts:
takeCurricula curriculaEasy2018
需要注意的几点是:
(1)抽象类(很好的编程概念)不能用OWL表示。我解释了OWL缺少来自编程背景here的一些令人惊讶的事情。
(2)不要将isElective
作为与Course
关联的属性,而是将其建模为ElectiveCourse
与NonElectiveCourse
的不相交关系。原因是,如果您想扩展NonElectiveCourse
的定义,您可以这样做。这也是为什么最好避免标记的原因。
(3)由于开放世界的假设,您必须以某种方式关闭您的Curricula
,并说明最多的课程数量,推理者将无法知道您不指定至少4 ElectiveCourse
s。我已经写过here。
**更新**
因此,您可以添加具有不同选修要求数量的CurruculaEasy
和CurruculaDifficult
类,如上所示。您可以添加Curricula
的超级CurruculaEasy
和CurriculaDifficult
。对于Curricula
,您可以将其添加为子类taughtInYear some xsd:integer
,如上所示。