如何构造有效的rdf/xml?

How to construct valid rdf/xml?

我有一个有效的 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 之外的其他标签,但是如果我打开 link 我看不到有效标签?如何修复错误?

I want to put all of them in one tag

为什么?

RDF/XML 是 XML 中 RDF 图的序列化,你受到 RDF/XML 规则的约束,你真的不应该关心 XML 看起来像什么喜欢。

如果您正在使用一个确实关心的系统,那么您正在使用的系统中存在 错误/糟糕的设计系统应该改变而不是 RDF。这当然假设您的 RDF/XML 表达了系统希望使用的适当的 RDF 图。

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

对于除琐碎示例之外的任何内容,您绝对不应该手动编辑 RDF。

正如@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 术语中:我们定义了一个 triple(或 statement):

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

您的 RDF 文件包含多个描述。尽管您没有显示任何其他 Description 元素的 rdf:about 属性,但我认为它们是不同的 - 这意味着它们是对 不同事物 的描述:

   <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" .

这显然是不可取的,因为它实际上是错误的(不只有一个人同时叫 "John" 和 "Paul",还有两个不同的人,一个叫 "John",其他名为 "Paul")。换句话说,它修复了语法问题,但弄乱了数据的实际含义

RDF/XML 中 rdf:RDF 元素下面的第一个元素应该是 rdf:Description 元素,或者是表示 class 名称的不同元素(这是一个 shorthand,用于写下资源的描述并通过添加 属性 为其分配 class)。让我们暂时忘记 shorthand 符号,只关注 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 处理器期望嵌套在描述中的元素是资源的 属性 - 但这里我们只有其他描述,没有迹象表明这些描述与 'outer' 描述之间的实际关系是什么。这可以通过在 属性 中进一步嵌套每个 'inner' 描述来解决,如下所示:

  <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>

这在语法上是合法的(假设您还向 ex 命名空间的 rdf:RDF 元素添加了命名空间定义),并保留了原始的单独描述的含义。如果你想限制必须重复 ex:contains 元素的次数,你也可以使用 RDF Collection,像这样:

  <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 工具 process/edit 文件,它很可能再次将这种表面语法更改为具有多个描述的内容。关键是依赖 RDF/XML 语法的精确语法格式是 非常糟糕的主意 (tm)。