[英]How to represent an enumeration in 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)選項之一:
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
實例旨在向人類讀者傳達容器中的元素是彼此替代的。 如果一個元素不能(同時)屬於兩種,這將適用於您的情況。 rdf:Seq
實例旨在向人類讀者傳達元素出現的順序很重要。 如果complete
是為了“跟進” intermediate
(從某種意義上來說),而intermediate
是為了跟進basic
那么這可能適用於您的情況。 rdf:Bag
實例旨在向人類讀者傳達元素出現的順序並不重要。 請注意,如果您使用rdfs:Container
這三個子類之一,則只需要替換上述三元組中的類表示術語即可。
rdfs:List
實例旨在向人類讀者傳達“元素種類”的集合已關閉。 例如,這暗示着以后沒有其他人可以添加的第四種“元素種類”。 對於您的情況,從概念上講,這將是以下三個方面:
〈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
那樣進行OR std::failbit|std::badbit
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.