为什么我们需要使用 rdf:parseType="Collection" 和 owl:intersectionOf?

Why do we need to use rdf:parseType="Collection" with owl:intersectionOf?

考虑以下摘自 http://www.w3.org/TR/owl-ref/#intersectionOf-def.

的示例
<owl:Class>
  <owl:intersectionOf rdf:parseType="Collection">
    <owl:Class>
      <owl:oneOf rdf:parseType="Collection">
        <owl:Thing rdf:about="#Tosca" />
        <owl:Thing rdf:about="#Salome" />
      </owl:oneOf>
    </owl:Class>
    <owl:Class>
      <owl:oneOf rdf:parseType="Collection">
        <owl:Thing rdf:about="#Turandot" />
        <owl:Thing rdf:about="#Tosca" />
      </owl:oneOf>
    </owl:Class>
  </owl:intersectionOf>
</owl:Class>

虽然我们了解第二个和第三个 rdf:parseType="Collection" 的用法,但我对 owl:intersectionOf 之后的第一个用法有些困惑。

在这个例子中owl:intersectionOf的值是两个class描述的列表,即两个枚举,都描述了一个class有两个人。由此产生的交集是 class 与一个个体,即 Tosca,因为这是两个枚举中唯一共有的个体。

如果我们省略第一个 rdf:parseType="Collection" 会发生什么?

如果相交的 class 是 不是 集合,我们还需要使用第一个 rdf:parseType="Collection" 吗?

owl:intersectionOf 的值应该是一个 RDF 列表。 RDF列表是链表,节点元素用rdf:first表示,链表尾部用rdf:rest表示,空链表用rdf:nil表示。可以想象,这很快就会变得非常冗长。使用 parseType Collection attribute 可以缩短序列化时间。它不是三元组,它只是 RDF/XML 序列化中的 shorthand。

这是您的代码段的完整版本:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#">
  <owl:Class>
    <owl:intersectionOf rdf:parseType="Collection">
      <owl:Class>
        <owl:oneOf rdf:parseType="Collection">
          <owl:Thing rdf:about="urn:ex#Tosca"/>
          <owl:Thing rdf:about="urn:ex#Salome"/>
        </owl:oneOf>
      </owl:Class>
      <owl:Class>
        <owl:oneOf rdf:parseType="Collection">
          <owl:Thing rdf:about="urn:ex#Turandot"/>
          <owl:Thing rdf:about="urn:ex#Tosca"/>
        </owl:oneOf>
      </owl:Class>
    </owl:intersectionOf>
  </owl:Class>
</rdf:RDF>

如果在 N-Triples 中序列化,您可以看到所有实际的三元组:

_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffd <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffe .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffd <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ff9 .
<urn:ex#Tosca> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Thing> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ff8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <urn:ex#Turandot> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ff8 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ff7 .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffb <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <urn:ex#Salome> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffb <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffe <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffe <http://www.w3.org/2002/07/owl#oneOf> _:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffc .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffc <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <urn:ex#Tosca> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffc <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> _:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffb .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ff9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> _:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffa .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ff9 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
<urn:ex#Turandot> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Thing> .
<urn:ex#Salome> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Thing> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ff7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> <urn:ex#Tosca> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ff7 <http://www.w3.org/1999/02/22-rdf-syntax-ns#rest> <http://www.w3.org/1999/02/22-rdf-syntax-ns#nil> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffa <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffa <http://www.w3.org/2002/07/owl#oneOf> _:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ff8 .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7fff <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class> .
_:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7fff <http://www.w3.org/2002/07/owl#intersectionOf> _:BX2D2b2d7d1aX3A1526aea91dcX3AX2D7ffd .

这是很多 rdf:first 和 rdf:rest 三元组。如果您不在 RDF/XML:

中使用该缩写,您会得到相同的结果
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#" > 
  <rdf:Description rdf:nodeID="A0">
    <rdf:first rdf:resource="urn:ex#Tosca"/>
    <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A1">
    <rdf:first rdf:resource="urn:ex#Turandot"/>
    <rdf:rest rdf:nodeID="A0"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A2">
    <rdf:first rdf:nodeID="A3"/>
    <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
  </rdf:Description>
  <rdf:Description rdf:about="urn:ex#Salome">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
  </rdf:Description>
  <rdf:Description rdf:about="urn:ex#Tosca">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
  </rdf:Description>
  <rdf:Description rdf:about="urn:ex#Turandot">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A3">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
    <owl:oneOf rdf:nodeID="A1"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A4">
    <rdf:first rdf:resource="urn:ex#Salome"/>
    <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A5">
    <rdf:first rdf:resource="urn:ex#Tosca"/>
    <rdf:rest rdf:nodeID="A4"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A6">
    <rdf:first rdf:nodeID="A7"/>
    <rdf:rest rdf:nodeID="A2"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A7">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
    <owl:oneOf rdf:nodeID="A5"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A8">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
    <owl:intersectionOf rdf:nodeID="A6"/>
  </rdf:Description>
</rdf:RDF>

因此,我们使用很好的 shorthands,RDF/XML 的 parseType 集合,或 Turtle 的括号:

@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

<urn:ex#Tosca>  a  owl:Thing .

_:b0    a          owl:Class ;
        owl:oneOf  ( <urn:ex#Tosca> <urn:ex#Salome> ) .

[ a                   owl:Class ;
  owl:intersectionOf  ( _:b0 _:b1 )
] .

_:b1    a          owl:Class ;
        owl:oneOf  ( <urn:ex#Turandot> <urn:ex#Tosca> ) .

<urn:ex#Turandot>  a  owl:Thing .

<urn:ex#Salome>  a  owl:Thing .

如果没有属性会怎样

What would have happened if we left out the first rdf:parseType="Collection"?

来自关于解析类型集合的文档:

RDF/XML allows an rdf:parseType="Collection" attribute on a property element to let it contain multiple node elements.

这表明如果没有解析类型集合属性,则 属性 元素不应包含多个元素。您需要阅读 2.2 Node Elements and Property Elements 以了解典型的语法是什么。一般来说,这个想法是代表三元组

x:s  x:p1  x:q1 .
x:s  x:p2  x:q2 .

你最终 XML 喜欢:

<rdf:Description rdf:about="...s">        <!-- a node element -->
  <x:p1>                                  <!-- a property element -->
    <rdf:Description rdf:about="...q1"/>  <!-- a node element -->
  </x:p1>
</rdf:Description>
<rdf:Description rdf:about="...s">        <!-- a node element -->
  <x:p2>                                  <!-- a property element -->
    <rdf:Description rdf:about="...q2"/>  <!-- a node element -->
  </x:p2>
</rdf:Description>

现在,有一个 shorthand 允许您在一个节点元素中使用多个 属性 元素。 2.3 Multiple Property Elements 中对此进行了描述,您可以改为执行此操作:

<rdf:Description rdf:about="...s">        <!-- a node element -->
  <x:p1>                                  <!-- a property element -->
    <rdf:Description rdf:about="...q1"/>  <!-- a node element -->
  </x:p1>
  <x:p2>                                  <!-- a property element -->
    <rdf:Description rdf:about="...q2"/>  <!-- a node element -->
  </x:p2>
</rdf:Description>

但是,没有这样的 shorthand 可以让您在单个 属性 元素中添加多个对象。也就是说,您不能 缩写三元组

x:s  x:p1  x:q1 .
x:s  x:p1  x:q2 .

来自

<rdf:Description rdf:about="...s">        <!-- a node element -->
  <x:p1>                                  <!-- a property element -->
    <rdf:Description rdf:about="...q1"/>  <!-- a node element -->
    <rdf:Description rdf:about="...q2"/>  <!-- a node element -->
  </x:p1>
</rdf:Description>

如果您有一个集合然后从中删除解析类型集合属性,那么您最终会得到这样的结果。我想这会是一个不错的功能,但也许它会与标准的其他部分发生冲突。无论如何,这就是为什么您在尝试时会收到警告;这是不合法的。

如果 类 不是交叉点

Do we still need to use the first rdf:parseType="Collection", if the intersecting classes are not collections?

如上所述,RDF/XML 是 RDF 的序列化,RDF 是一种抽象数据模型(它只是三元组)。 RDF/XML 增加了许多您不必担心的复杂性。事实上,您正在使用 OWL 文件使事情变得更加复杂,因为 OWL 是另一种抽象表示(它只是公理)。有一个从 OWL 到 RDF 的映射,有点复杂。因此,您正在查看具有两层编码的内容:

OWL(公理)⇒ RDF(三元组) ⇒ RDF/XML

OWL对解析类型收集和RDF/XML序列化一无所知,它只知道OWL。有一个知道 OWL 和 RDF 的映射,这就是生成 RDF 三元组的原因。 RDF 对解析类型集合一无所知。有一个从 RDF 到 XML 的映射知道它。您的 RDF 需要是合法的 RDF,句号。

如果您使用 OWL,请使用 OWL 工具。
如果您正在使用 RDF,请使用 RDF 工具。
如果您使用 XML,请使用 XML 工具。