为什么我们需要在owl:intersectionOf中使用rdf:parseType =“Collection”?

时间:2016-01-22 13:25:53

标签: rdf owl

考虑以下示例,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的值是两个类描述的列表,即两个枚举,两者都描述具有两个个体的类。生成的交集是一个具有一个个体的类,即Tosca,因为这是两个枚举共有的唯一个体。

如果我们遗漏了第一个rdf:parseType="Collection"会怎么样?

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

1 个答案:

答案 0 :(得分:6)

owl:intersectionOf的值应该是RDF列表。 RDF列表是链表,其中节点的元素由rdf:first表示,列表的尾部由rdf:rest表示,空列表由rdf:nil表示。你可以想象,这很快变得非常冗长。使用parseType Collection attribute可以缩短序列化时间。它不是三元组,它只是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#">
  <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:第一和rdf:休息三元组。如果您不在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>

因此,我们使用了很好的缩写,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 .

如果没有属性

会发生什么
  

如果我们遗漏了第一个rdf:parseType="Collection"会怎么样?

从解析类型集合的文档:

  

RDF / XML允许属性元素上的rdf:parseType =“Collection”属性允许它包含多个节点元素。

这表明如果没有解析类型集合属性,则属性元素不应包含多个元素。您想要阅读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>

现在,有一个简写,允许您在节点元素中使用多个属性元素。这在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>

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

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>

如果您有一个集合,然后从中删除了解析类型集合属性,那么这就是您最终会得到的结果。我认为这将是一个很好的功能,但也许标准的其他部分会与之冲突。无论如何,这就是你尝试时收到警告的原因;这不合法。

如果课程不是交叉点

  

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

如上所述,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工具。