rdf - 使用类或概念来建模枚举
问题描述
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> .
解决方案
在编程中,枚举是一种独特的类类型,其中类的实例是预定义的和最终的。也就是说,不能将新实例添加到枚举中。
严格来说,我不认为您所说的在 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 .
将导致不一致。
如果您不需要运行推理器,则没有理由考虑使用枚举。
推荐阅读
- jquery - Jquery UI Sortable 存在
- python - 如何将 count() 数字除以 Mongodb/Python 中的数字?
- tensorflow - 用于训练和推理的 TensorFlow 嵌入
- html - “如何使用谷歌地图 API 让搜索框自动完成”
- php - 如何在不删除旧数据的情况下向数据库列添加新值
- angular - Angular 6,如何获取“onSelectionChange”dom事件的目标元素?
- django - NoReverseMatch 在 /products/ ,“产品”不是注册的命名空间
- angular - 星云企业主题不能开箱即用
- ios - Swift 将不同类型组合成一个数组来显示 UITableView 的数据
- android - 如何在 android (editText) 中编写新的材料设计文本字段