【问题标题】:How to represent an enumeration in RDF/XML?如何在 RDF/XML 中表示枚举?
【发布时间】:2015-08-19 19:40:03
【问题描述】:

我有这样的代码:

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>

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

【问题讨论】:

  • 1) 我希望您不是手动构建 RDF/XML 表示;如果你需要手工编写 RDF,使用 N3/Turtle 会容易得多。 2) 如果您使用 owl:Class 之类的东西,那么您可能正在编写 OWL 本体,在这种情况下,OWL 本体编辑器(如 Protege)可能会更有帮助。
  • 至于如何做到这一点,这真的取决于你想如何做到这一点。您可以定义一个数据属性,其范围是值的枚举(例如,具有范围 {"Kind1"、"Kind2"、"Kind3"} 的 hasElementKind。或者,您可以使枚​​举元素成为某个 OWL 类的个体,例如, ElementKind = { Kind1, Kind2, Kind3 }。哪个更有意义取决于你想用它做什么。
  • 感谢您的评论,Joshua Taylor。我目前正在使用 Protégé。你能把它改写成 Protégé 的步骤吗?我也在尽量避免使用实例。
  • 您有什么特别的原因要避开个人吗?这似乎有点适得其反?毕竟,您在编程语言中使用枚举,而不是使用整数等“原始数据”值。使用枚举值提供一些有意义的抽象不是重点之一。如果您不想使用抽象,那么您可能不应该在代码中使用“ElementType”,对吗?如果“ElementType”值实际上对应于整数 (0,1,2),那么您可以在任何地方都使用整数,不是吗?

标签: xml rdf owl


【解决方案1】:

如果您只想向人类读者传达含义,您可以选择以下两个 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 的实例旨在将传达给人类 读者 容器中的元素是每个元素的替代品 其他。如果元素不能(在 同一时刻)有两种。
  • rdf:Seq 的实例是 旨在向人类读者传达 元素发生意义重大。这可能适用于您的情况,如果 complete 旨在“跟进”intermediate(在某种意义上 这个词)和intermediate旨在“跟进”basic
  • rdf:Bag 的实例旨在将传达给人类 读者 元素出现的顺序不是 意义重大。

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

2。 RDF 列表

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〉

【讨论】:

    【解决方案2】:

    我可以想到两种表示枚举的方法: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 一样进行 OR 运算的 C 样式位域枚举

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多