首页 > 解决方案 > 使用类或概念来建模枚举

问题描述

SKOS 具有概念和概念方案的概念,可以粗略地用于对标准编程语言中已知的枚举进行建模。概念也可以定义为比彼此更宽或更窄,大致相当于位标志枚举。

假设一个人想要描述基本方向之类的东西,以下是可能的:

<CardinalDirections> a skos:ConceptScheme .

<north> skos:inScheme <CardinalDirections> .
<east> skos:inScheme <CardinalDirections> .
<south> skos:inScheme <CardinalDirections> .
<west> skos:inScheme <CardinalDirections> .

然而,枚举通常也是各种语言类型系统的一部分,所以我也可以选择这种解释:

<CardinalDirection> a rdfs:Class .

<north> a <CardinalDirection> .
<east> a <CardinalDirection> .
<south> a <CardinalDirection> .
<west> a <CardinalDirection> .

那么,a)使用一个模型而不是另一个模型有什么好处吗?b) 将它们结合起来有意义吗?

<CardinalDirection> a rdfs:Class , skos:ConceptScheme .

<north> a <CardinalDirection> ; skos:inScheme <CardinalDirection> .
<east> a <CardinalDirection> ; skos:inScheme <CardinalDirection> .
<south> a <CardinalDirection> ; skos:inScheme <CardinalDirection> .
<west> a <CardinalDirection> ; skos:inScheme <CardinalDirection> .

标签: rdfskos

解决方案


在编程中,枚举是一种独特的类类型,其中类的实例是预定义的和最终的。也就是说,不能将新实例添加到枚举中。

严格来说,我不认为您所说的在 RDF 中表示枚举实际上是一个枚举。相反,它是同一类的多个实例。特别是,没有什么禁止做出以下声明:

<apple> a <CardinalDirection> . 

为了更清楚地看到这一点,请考虑以下示例:

<Person> a rdfs:Class .

<peter> a <Person> .
<susan> a <Person> .
<kyle> a <Person> .

显然这个Person类不是一个枚举。

在 RDF 中,没有办法禁止向类添加额外的实例,这是定义枚举所需的。

如果要定义枚举,则需要使用 OWL。然后你可以通过以下方式定义一个枚举:

:CardinalDirection rdf:type owl:Class ;
               owl:equivalentClass [ rdf:type owl:Class ;
                                     owl:oneOf ( :East
                                                 :North
                                                 :South
                                                 :West
                                               )

例如:East,您在其中定义如下:

:East rdf:type owl:NamedIndividual ,
           :CardinalDirection .

你什么时候会以这种方式定义一个枚举?当您计划对您的模式或数据运行 OWL 推理器时。在这种情况下,添加:apple a :CardinalDirection .将导致不一致。

如果您不需要运行推理器,则没有理由考虑使用枚举。


推荐阅读