如何在RDF/XML中表示枚举



我有一个这样的代码:

enum ElementKind {
    BASIC (0),
    INTERMEDIATE (1),
    COMPLETE (2);
}
class Element {
    private ElementKind elementKind;
    /* ... */
}

我正在为这个代码构建一个RDF/XML(本体)表示:

<owl:Class rdf:about="#ElementKind">
    // how to define?
</owl:Class>
<owl:Class rdf:about="#Element">
</owl:Class>

表示该枚举的最佳方式是什么?

如果您只想向人类读者传达含义,您可以使用以下两个RDF(S)选项之一:

1。RDFS容器

rdfs:Container的实例旨在向人类读者传达它的元素构成了一个开放集合。您是否在处理公开收集取决于是否存在第四种选择。对于您的情况,这在概念上相当于以下三元组:

〈ex:elementKind, rdf:type, rdfs:Container〉
〈ex:elementKind, rdf:_1,   ex:basic〉
〈ex:elementKind, rdf:_2,   ex:intermediate〉
〈ex:elementKind, rdf:_3,   ex:complete〉

如果你想传达更多的人类意义,那么你可以选择RDFS容器的三个子类之一:

  • rdf:Alt的实例旨在将传递给人类Reader 表示容器中的元素是每个元素的替代品其他。如果元素不能(在
  • rdf:Seq的实例为旨在向人类读者传达的顺序元素的发生是有意义的。这可能适用于你的情况,如果complete意在"跟进"intermediate(在某种意义上)intermediate是为了"跟进"basic
  • rdf:Bag的实例旨在将传递给人类Reader 元素出现的顺序不是重要。

注意,如果您使用rdfs:Container的这三个子类之一,您只需要替换上述三元组中表示类的项。

2。RDF列表

rdfs:List的实例旨在将传达给人类读者,即'element types '的集合已关闭。例如,这可能意味着没有第四种"元素类型"可以稍后由其他人添加。对于您的情况,这在概念上相当于以下三元组:

〈ex:elementKind, ∊, rdf:List〉
〈ex:elementKind, rdf:first, ex:basic〉
〈ex:elementKind, rdf:rest, _:4〉
〈_:4, ∊, rdf:List〉
〈_:4, rdf:first, ex:intermediate〉
〈_:4, rdf:rest, _:5〉
〈_:5, ∊, rdf:List〉
〈_:5, rdf:first, ex:complete〉
〈_:5, rdf:rest, rdf:nil〉

我可以想到两种表示枚举的方法:DisjointUnion方法和OneOf方法。

1)在DisjointUnion方法中,您将所有枚举常量表示为类E1, ..., En,并将枚举定义为这些类的不相交联合:

DisjointUnion(Enum,E1,...,En)

这个公理说明所有的E1...En都是不相交的,而Enum是它们的并集(所以每个Enum的实例都是一个Ei的实例)。

2)您可以将所有Ei定义为不同的个体,并将Enum定义为它们的并集:

EquivalentClasses(Enum,OneOf(E1,...,En)); AllDifferent(E1,...,En)

这两个方法都不允许使用c风格的位域枚举,它们可以像std::failbit|std::badbit

那样组合在一起

最新更新