【问题标题】:Why must rdf:dataType subclass rdf:Class in RDF?为什么 rdf:dataType 必须继承 RDF 中的 rdf:Class?
【发布时间】:2014-07-18 05:09:53
【问题描述】:

来自RDF Schema 1.1

2.4 rdfs:Datatype

rdfs:Datatype 是数据类型的类。所有实例 rdfs:Datatype 对应于 RDF 模型中描述的数据类型 RDF 概念规范 [RDF11-CONCEPTS]。 rdfs:数据类型是两者 rdfs:Class 的实例和子类。每个实例 rdfs:Datatype 是 rdfs:Literal 的子类。

为什么必须 rdfs:Datatype 子类化 rdf:Class?为什么它不能只是 rdfs:Class 的一个实例?我不明白子类化的含义。

【问题讨论】:

  • (i) “如果 X 是 rdfs:Datatype,那么 X 是 rdfs:Class。”这是子类关系的传统定义,因此 rdfs:Datatype 是 rdfs:Class 的子类。 (ii) 另外,因为有些东西是 rdfs:Datatypes,所以 rdfs:Datatype 本身就是一个 rdfs:Class。 (iii) 因此 rdfs:Datatype 既是 rdfs:Class 的子类,又是 rdfs:Class 的实例。

标签: rdf semantic-web ontology rdfs


【解决方案1】:

子类和实例

虽然可能存在细微差别,但通常可以将类视为集合以及子集的子类。当我们说“每个 X 也是一个 Y”时,我们通常会识别子集关系,在这种情况下 X ⊆ Y。当我们可以说“X 是一个 Y”时,我们通常将事物理解为集合,在这种情况下,X 是一个元素,Y 是一个集合。

我们肯定希望能够对 X 的值(例如 xsd:integer)说“X 是一个 rdfs:Datatype”,所以我们确实希望 rdfs:Datatype 是一个类,它表示我们想要

(1) rdfs:Datatype rdf:type rdfs:Class.

问题是我们是否想要

(2) rdfs:Datatype rdfs:subClassOf rdfs:Class.

因为 rdfs:subClassOf 的域是 rdfs:Class,所以 (2) 实际上隐含了 (1)。也就是说,任何事物的子类都是类,所以如果我们断言 (2),那么 (1) 逻辑上会遵循。我们绝对想要(1)。问题是我们是断言 (2) 并免费获得 (1) 和 (2),还是只断言 (1) 并跳过 (2)。

从概念上讲,(2) 是有道理的。任何属于数据类型的东西都是属于类型的东西。如果某个 D 是一种数据类型,那么像“x is a D”这样的句子是有意义的。这意味着数据类型集是所有类的子集。这证明接受 (2) 是合理的。

具体的可能性

(2)(和隐含的 (1))

将其视为实例、类和元类的层次结构可能会有所帮助。 rdfs:subClassOf 是同一层元素之间的链接,而 rdf:type 是一层元素和更高层之间的链接。如果 rdfs:Datatype 是 rdfs:Class 的子类,那么我们将所有“事物”保持在同一级别:

(1)单独(没有(2))

如果我们将 rdfs:Datatype 设为 rdfs:Class 的 instance,那么特定的数据类型,例如 xsd:integer,现在与我们的个人(如 John Doe)处于同一层,并且这些数据类型的实例,例如,三十,位于较低层:

现在,这是否是一件大事有待商榷。类和元类的概念 在像 RDF 这样的开放式表示中并不严格。毕竟,rdfs:Class 是 rdfs:Class 的一个instance

cmets 中的一个选项

您在Jeen's answer 上的your comment 中提到了第三种选择(强调添加):

但是假设 rdf:Datatype 只是一个类的实例而不是 子类。会有什么不同?!你提到的一切 仍然成立。 xsd:integer 仍然可以继承 rdf:Datatype,并且 xsd:integer 的实例将具有类 xsd:integer。好像没有 完全引入 rdf:Class 子类的原因。我不 了解它为 ~semantics 添加了什么。

您不希望 xsd:integer 成为 rdfs:Datatype 的子类,因为这会说“如果 X 是整数,则 X 是数据类型”,这确实不是我们所期望的。 30 是整数,但不是数据类型;我们通常不会说某事“属于 30 型”。在你的链条中

rdsf:Class ←X—rdfs:Datatype ←Y—xsd:integer

您可以将 X 设为 rdfs:subClassOf (case (2)) 或 rdf:type (case (1)),但 Y 确实需要是 rdf:type,而不是 rdfs:subClassOf,因为整数和数据类型是不同的种类

【讨论】:

  • 感谢您的详细回复。我不明白你反对我的替代方案。事实上,我认为我的替代方案就是您在第二个方案中要提出的方案。您的第二种选择是有缺陷的,或者至少是模棱两可的:如果 xsd:integer 是 rdf:dataType 而不是 rdf:Class 那么说 ex:Thirty 是 xsd:integer 没有意义,因为 xsd:integer 不是一个类。要解决此问题,您必须使 rdf:dataType 成为 rdf:class 的子类,然后我们回到原点。我的方式 rdf:Datatype 和 rdf:integer 是类,而 rdf:integer 子类 rdf:Datatype 子类 rdf:literal。
  • @FrancisM.Bacon 在 RDF 中什么是类和什么是属于类的“元素”之间没有硬性的区别。这就是为什么,例如,rdfs:Class 可以是 rdfs:Class 的一个实例。据我了解,您在评论中提出的建议是使 rdfs:Datatype 成为 rdfs:Class 的 instance,而不是 rdfs:Class 的 subclass,然后使 xsd:integer 成为 rdfs:Datatype 的子类。让 xsd:integer 成为 rdfs:Datatype 的子类没有意义,因为这意味着“如果某物是 xsd:integer,那么它也是 rdfs:Dtatype”,但是……
  • ...没有意义,因为例如,数字 30 是 xsd:integer,但不是 rdfs:Datatype。将 rdfs:Datatype 设为 rdfs:Class 的实例还是 rdfs:Class 的子类并不重要,但 xsd:integer 必须是 rdfs:Datatype 的实例,而不是 rdfs:Datatype 的子类,因为 xsd:integers 不是 rdfs:Datatypes.
  • 当我想到“rdf:Datatype”时,我想到的更多是“一种数据”。对我来说,“30”是“一种数据”是有道理的。但也想多了,我能明白你的意思,并开始看到子类化一个类的含义。将 xsd:integer 视为一种数据类型,我们想对数据类型进行推理——类本身,它不仅仅是一种像其他类一样创建事物层次结构的机制。因此我们是子类。好的!我认为:)。
  • 我仍然认为第二个图表是错误的或模棱两可的。
【解决方案2】:

原因是数据类型本身被视为抽象模型中的一个类,其实例是具有该数据类型的值的实际出现。

例如,数据类型xsd:integer可以被认为是“所有整数的类”,因此,由于类rdfs:Datatype是“所有数据类型类的类”,它是@987654323的子类@(所有类的类)。

【讨论】:

  • 但是假设 rdf:Datatype 只是一个类的实例而不是子类。会有什么不同?!你提到的一切仍然有效。 xsd:integer 仍然可以是 rdf:Datatype 的子类,并且 xsd:integer 的实例将具有 xsd:integer 类。似乎根本没有理由引入 rdf:Class 的子类。我不明白它在 ~semantics 中添加了什么。
  • @FrancisM.Bacon 因为 rdfs:subClassOf 的域是 rdfs:Class,一旦你断言“Datatype subClassOf Class”,你也隐式断言“Datatype rdf:type Class”,所以在这两种情况下,您都会得到“Datatype rdf:type Class”。
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 2017-09-12
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2013-10-23
  • 2016-01-27
相关资源
最近更新 更多