如何在 RDF/XML 中表示枚举?
How to represent an enumeration in RDF/XML?
我有这样的代码:
enum ElementKind {
BASIC (0),
INTERMEDIATE (1),
COMPLETE (2);
}
class Element {
private ElementKind elementKind;
/* ... */
}
我正在为此代码构建一个 RDF/XML (ontology) 表示:
<owl:Class rdf:about="#ElementKind">
// how to define?
</owl:Class>
<owl:Class rdf:about="#Element">
</owl:Class>
表示该枚举的最佳方式是什么?
我可以想到两种表示枚举的方法: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)
这两种方法都不允许您使用可以像 std::failbit|std::badbit
一样进行 ORed 运算的 C 风格位域枚举
如果您只想向人类传达意思reader,您可以选择以下两个 RDF(S) 选项之一:
1。 RDFS 容器
rdfs:Container
的实例旨在向人类reader 传达其元素形成一个开放的collection。您是否正在处理 open collection 取决于是否存在第四个选项。对于您的情况,这在概念上相当于以下三元组:
〈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
的实例是
旨在 向人类 reader 传达
元素的出现意义重大。这可能适用于您的情况,如果
complete
旨在 'follow-up' intermediate
(某种意义上
词的)和 intermediate
的意思是 'follow-up' basic
。
rdf:Bag
的实例旨在向人类传达
reader表示元素出现的顺序不是
意义重大。
请注意,如果您使用 rdfs:Container
的这三个子类之一,您只需替换上述三元组中的 class-denoting 项。
2。 RDF 列表
rdfs:List
的实例旨在向 人 reader 传达 'element kinds' 的 collection 已关闭。例如,这意味着没有第四个 'element kind' 可以由其他人稍后添加。对于您的情况,这在概念上相当于以下三元组:
〈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〉
我有这样的代码:
enum ElementKind {
BASIC (0),
INTERMEDIATE (1),
COMPLETE (2);
}
class Element {
private ElementKind elementKind;
/* ... */
}
我正在为此代码构建一个 RDF/XML (ontology) 表示:
<owl:Class rdf:about="#ElementKind">
// how to define?
</owl:Class>
<owl:Class rdf:about="#Element">
</owl:Class>
表示该枚举的最佳方式是什么?
我可以想到两种表示枚举的方法: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)
这两种方法都不允许您使用可以像 std::failbit|std::badbit
如果您只想向人类传达意思reader,您可以选择以下两个 RDF(S) 选项之一:
1。 RDFS 容器
rdfs:Container
的实例旨在向人类reader 传达其元素形成一个开放的collection。您是否正在处理 open collection 取决于是否存在第四个选项。对于您的情况,这在概念上相当于以下三元组:
〈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
的实例是 旨在 向人类 reader 传达 元素的出现意义重大。这可能适用于您的情况,如果complete
旨在 'follow-up'intermediate
(某种意义上 词的)和intermediate
的意思是 'follow-up'basic
。rdf:Bag
的实例旨在向人类传达 reader表示元素出现的顺序不是 意义重大。
请注意,如果您使用 rdfs:Container
的这三个子类之一,您只需替换上述三元组中的 class-denoting 项。
2。 RDF 列表
rdfs:List
的实例旨在向 人 reader 传达 'element kinds' 的 collection 已关闭。例如,这意味着没有第四个 'element kind' 可以由其他人稍后添加。对于您的情况,这在概念上相当于以下三元组:
〈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〉