如何构造有效的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)。
我有一个有效的 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)。