如何构造有效的rdf / xml?

时间:2015-11-05 16:14:51

标签: validation rdf

我有一个有效的rdf / xml文件,我必须把它放在另一个标签中,所以在第一级只有一个标签元素。

<?xml version="1.0"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:rtc_cm="http://jazz.net/xmlns/prod/jazz/rtc/cm/1.0/"
    xmlns:oslc="http://open-services.net/ns/core#" >
<rdf:Description rdf:about="https://10.0.2.79:9443/ccm/oslc/types/_tsVvMWWwEeWQIIEAtKgWEg/com.ibm.team.apt.workItemType.story">
    <rdf:type rdf:resource="http://jazz.net/xmlns/prod/jazz/rtc/cm/1.0/Type"/>
    <rtc_cm:projectArea rdf:resource="https://10.0.2.79:9443/ccm/oslc/projectareas/_tsVvMWWwEeWQIIEAtKgWEg"/>
    <rtc_cm:category rdf:datatype="http://www.w3.org/2001/XMLSchema#string">com.ibm.team.workitem.workItemType.story</rtc_cm:category>
    <rtc_cm:iconUrl rdf:resource="https://10.0.2.79:9443/ccm/service/com.ibm.team.workitem.common.internal.model.IImageContentService/processattachment/_tsVvMWWwEeWQIIEAtKgWEg/workitemtype/story.gif"/>
    <dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Story</dcterms:title>
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">com.ibm.team.apt.workItemType.story</dcterms:identifier>
  </rdf:Description>
...
   <rdf:Description ...2>
   </rdf:Description ...2>
    </rdf:RDF>

在这里,您可以看到可以有多个Description元素。 我想将所有这些都放在一个标签中。怎么做?如果我尝试:

<?xml version="1.0"?>
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:dcterms="http://purl.org/dc/terms/"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:rtc_cm="http://jazz.net/xmlns/prod/jazz/rtc/cm/1.0/"
    xmlns:oslc="http://open-services.net/ns/core#" >
<rdf:MyTag rdf:about="https://10.0.2.79:9443/ccm/oslc/types/_tsVvMWWwEeWQIIEAtKgWEg/com.ibm.team.apt.workItemType.story">
<rdf:Description rdf:about="https://10.0.2.79:9443/ccm/oslc/types/_tsVvMWWwEeWQIIEAtKgWEg/com.ibm.team.apt.workItemType.story">
    <rdf:type rdf:resource="http://jazz.net/xmlns/prod/jazz/rtc/cm/1.0/Type"/>
    <rtc_cm:projectArea rdf:resource="https://10.0.2.79:9443/ccm/oslc/projectareas/_tsVvMWWwEeWQIIEAtKgWEg"/>
    <rtc_cm:category rdf:datatype="http://www.w3.org/2001/XMLSchema#string">com.ibm.team.workitem.workItemType.story</rtc_cm:category>
    <rtc_cm:iconUrl rdf:resource="https://10.0.2.79:9443/ccm/service/com.ibm.team.workitem.common.internal.model.IImageContentService/processattachment/_tsVvMWWwEeWQIIEAtKgWEg/workitemtype/story.gif"/>
    <dcterms:title rdf:datatype="http://www.w3.org/2001/XMLSchema#string">Story</dcterms:title>
    <dcterms:identifier rdf:datatype="http://www.w3.org/2001/XMLSchema#string">com.ibm.team.apt.workItemType.story</dcterms:identifier>
  </rdf:Description>
</rdf:MyTag>
</rdf:RDF>

我添加了MyTag,但出现错误:

Error: {E205} rdf:Description is not allowed as an element tag here.[Line = 9, Column = 128]
Error: {E201} rdf:about not allowed as attribute here.[Line = 9, Column = 128]
Error: {E201} rdf:resource not allowed as attribute here.[Line = 10, Column = 79]
Error: {E201} Multiple children of property element[Line = 11, Column = 110]
Error: {E201} rdf:resource not allowed as attribute here.[Line = 11, Column = 110]
......

Warning: {W113} rdf:MyTag is not a recognized RDF property or type.[Line = 8, Column = 122]

我用于验证: http://www.w3.org/RDF/Validator/

我做点蠢事。可能在http://www.w3.org/RDF/Validator/中定义了除MyProp之外的其他标签,但如果我打开该链接,我看不到有效标签?如何解决错误?

2 个答案:

答案 0 :(得分:4)

  

我想把所有这些都放在一个标签中

为什么?

RDF / XML是XML格式的RDF图的序列化,你受到RDF / XML规则的限制,你真的不应该关心XML是什么样的。

如果您正在使用的系统非常谨慎,那么您正在使用的系统中存在错误 / 设计不佳,系统应该更改而不是RDF 。当然,这假设您的RDF / XML表达了系统希望使用的相应RDF图。

任何对RDF / XML(或任何其他RDF序列化)的操作都应使用适当的API或工具包来完成,该工具包将为您理解并执行规则。

对于任何超出微不足道的例子,你都应该永远不要手工编辑RDF。

答案 1 :(得分:1)

正如@RobV指出的那样,技术上可以做到这一点,但是你所使用的工具需要这个问题从根本上是有问题的,并且可能表明更深层次的问题 - 所以我怀疑修复它会对你有所帮助:任何修复导致语法合法的RDF / XML可能仍然无法通过此工具处理。

但是,这里是:在RDF / XML中,每个Description元素捕获特定资源的描述(就其属性而言)。描述的资源是rdf:about属性中标识的资源。

所以:

   <rdf:Description rdf:about="http://example.org/person1">
          <rdfs:label>John</rdfs:label>
   </rdf:Description>

是单个资源http://example.org/person1及其属性rdfs:label的说明,其值为“John”。在RDF术语中:我们定义了一个三元(或语句):

<http://example.org/person1> rdfs:label "John" .

您的RDF文件包含多个说明。虽然您没有显示任何其他rdf:about元素的Description属性,但我认为它们是不同的 - 这意味着它们是不同内容的描述

   <rdf:Description rdf:about="http://example.org/person1">
          <rdfs:label>John</rdfs:label>
   </rdf:Description>
   <rdf:Description rdf:about="http://example.org/person2">
          <rdfs:label>Paul</rdfs:label>
   </rdf:Description>

对应于以下RDF语句:

<http://example.org/person1> rdfs:label "John" .
<http://example.org/person2> rdfs:label "Paul" .

我们当然可以将所有内容放在一个Description元素中,但是它的rdf:about属性的值应该变成什么?如果我们随机选择一个,我们会得到这样的东西:

   <rdf:Description rdf:about="http://example.org/person1">
          <rdfs:label>John</rdfs:label>
          <rdfs:label>Paul</rdfs:label>
   </rdf:Description>

虽然这样做会导致语法正确的RDF / XML,但它对应于以下RDF模型:

<http://example.org/person1> rdfs:label "John" .
<http://example.org/person1> rdfs:label "Paul" .

这显然是不可取的,因为它实际上是错误的(不只有一个人称为“约翰”和“保罗”,有两个独立的人,一个名为“约翰”,另一个名为“保罗”)。换句话说,它修复了语法问题,但却弄乱了数据的实际含义

RDF / XML中rdf:RDF元素下面的第一个元素应该是rdf:Description元素,或者是指示类名的不同元素(这是写下描述的简写)一个资源,并通过添加属性为其分配一个类)。让我们忘掉那个简短的符号,然后专注于rdf:Description。显然,我们不能只有这样的东西:

 
  <rdf:Description> 
     <rdf:Description rdf:about="http://example.org/person1">
          <rdfs:label>John</rdfs:label>
     </rdf:Description>
     <rdf:Description rdf:about="http://example.org/person2">
          <rdfs:label>Paul</rdfs:label>
     </rdf:Description>
  </rdf:Description>

这在语法上是无效的,因为RDF处理器期望嵌套在描述中的元素是资源的属性 - 但是在这里我们只有其他描述,没有任何关于实际关系的指示这些描述和“外部”描述之间是。这可以通过在属性中进一步嵌套每个“内部”描述来修复,如下所示:

 
  <rdf:Description> 
     <ex:contains> 
        <rdf:Description rdf:about="http://example.org/person1">
            <rdfs:label>John</rdfs:label>
        </rdf:Description>
     <ex:contains>
     <ex:contains>
        <rdf:Description rdf:about="http://example.org/person2">
            <rdfs:label>Paul</rdfs:label>
        </rdf:Description>
     <ex:contains>
  <rdf:Description>

这是合法的合法(假设您还为rdf:RDF命名空间的ex元素添加了命名空间定义),并保留了原始单独描述的含义。如果您想限制重复ex:contains元素的次数,您也可以使用RDF集合,如下所示:

 
  <rdf:Description> 
     <ex:contains rdf:parseType="Collection"> 
        <rdf:Description rdf:about="http://example.org/person1">
            <rdfs:label>John</rdfs:label>
        </rdf:Description>
        <rdf:Description rdf:about="http://example.org/person2">
            <rdfs:label>Paul</rdfs:label>
        </rdf:Description>
     <ex:contains>
  <rdf:Description>

尽管如此:虽然这解决了您所询问的具体问题,但这些解决方案都不太可能对您有所帮助。如果您用于处理此数据的工具无法处理多个rdf:Description,则不太可能能够有意义地处理上述任何一个文件。而且,只要您使用任何类型的正确RDF工具来处理/编辑文件,它很可能会再次将此表面语法更改为具有多个描述的内容。关键是依赖于RDF / XML语法的精确语法格式是非常糟糕的想法(tm)。