子类和实例
虽然可能存在细微差别,但通常可以将类视为集合以及子集的子类。当我们说“每个 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,因为整数和数据类型是不同的种类。