如何使用MIME类型来表示RDF类型的字面量

3
RDF允许使用类型化字面量来指定字符串值的数据类型。这通常用于XML Schema数据类型,例如xsd:integerxsd:date
<https://example.org/> dc:created "1999-12-17"^^xsd:date.

在RDF中,如何使用类型化文字指定由(或扩展)IANA MIME类型注册表定义的数据类型?我想做类似于这样的事情:
<https://example.org/>
  dc:description "I love cookies!" ;
  dc:description "I <em>love</em> cookies!"^^<text/html> ;
  dc:description "I *love* cookies!"^^<text/x-markdown> ;
  dc:description "I \\emph{love} cookies!"^^<application/x-tex> .

但是纯 MIME 类型不是有效的数据类型IRI。是否存在官方的URI命名空间用于MIME类型,并且是否已将这些URI用于RDF类型文字?


存在 rdf:HTML 数据类型。 - Stanislav Kralin
1个回答

1

没有官方的方法将MIME类型用作RDF(或XML模式)数据类型,因为这样的事情意味着含义不明确。 MIME类型描述一系列字节,而RDF文字始终是一系列Unicode字符。您必须定义一个方法,将词法值转换为字节序列,然后进行解释,并且对于非文本格式,您可能需要从xsd:base64Binaryxsd:hexBinary开始。除此之外,您的一些示例仅仅是片段,而不是可以独立验证的文档,因此首先让我们看看其他选项:

非MIME数据类型

我建议首先寻找要支持的格式的具体标识符,但即使如此,您仍然可能会有几个选择:

  • rdf:XMLLiteralrdf:HTMLrdf:JSON是官方标准,应该用于这些语言中的有效文字。
  • Extra Types!是一个现有的词汇表,用于格式和片段。对于您的示例,您可以轻松使用xtypes:Fragment-HTMLxtypes:Fragment-Markdownxtypes:Fragment-LaTeX。可能有点模糊的是“片段”在这里到底是什么意思。我认为它的意思是像'<tag attr="a">'^^xtypes:Fragment-XML这样的东西是有效的,而'<tag attr="a">'^^rdf:XMLLiteral不是(它必须是自包含的,类似于application/xml-external-parsed-entity)。
  • 所有格式也都作为实体存在于DBPedia中,因此您可以使用像http://dbpedia.org/resource/Markdown这样的URI,但这些并没有明确定义为数据类型,因此一些处理器可能会很难找到它们的定义。
  • 另一个不错的词汇表是W3C的Unique URIs for File Formats,但它只包含RDF序列化格式,并没有明确定义它们为数据类型。
  • 一些数据格式可能具有现有的YAML标记,这些标记非常类似于XML模式数据类型,并且可以使用URI表示。然而,我无法找到更多的例子,除了tag:yaml.org,2002:yaml用于YAML之外。
  • 还有一个遥远的可能性,可以从用于SGML符号的PUBLIC标识符中派生URI。对于TeX,URI将是urn:publicid:%2B:ISBN+0-201-13448-9;Knuth:NOTATION+The+TeXbook:EN,但这些已不再生产(您可以在此处找到它们的集合)。

我不建议使用除了http(s)之外的任何URI方案,因为至少人类应该能够通过HTTP找出它的含义。

MIME类型的URIs

如果你想要为MIME类型拥有URIs(但不一定用作数据类型),你可以使用类似于uri4uri的东西来到达MIME类型的RDF描述,例如https://w3id.org/uri4uri/mime/text/markdown(但请注意Markdown需要charset参数,所以它应该是https://w3id.org/uri4uri/mime/text/markdown;charset=utf-8——参数也受支持!)。

您还可以参考IANA注册文档,例如https://www.iana.org/assignments/media-types/text/markdown,但那只是一个文档,并非所有MIME类型都有。这个URL模式也可以用于非标准MIME类型,例如https://www.iana.org/assignments/media-types/text/yaml,但这些类型除非正式注册否则无法解析。

使用语言标签

我能想到的另一个选项是(滥用)语言标签而不是数据类型来实现此目的,例如对于Markdown使用zxx-Latn-x-md,对于TeX使用zxx-Latn-x-tex。这绝对没有标准化(除了zxx可用于编程源代码等内容,以及Latn用于使用拉丁字母的文本),我不建议将其用于应该被解析的文字,将其视为影响文本的呈现方式,例如选择语法高亮器。

使用data: URI

将文本和 MIME 类型组合的唯一标准化方法是使用 data URI 方案,但您不会得到一个字面值:

<https://example.org/>
  dc:description <data:text/markdown;charset=utf-8,I%20*love*%20cookies!> .

<data:text/markdown;charset=utf-8,I%20*love*%20cookies!>
  a <https://w3id.org/uri4uri/mime/text/markdown;charset=utf-8> ;
  rdf:value "I *love* cookies!" .

1
感谢提供了全面的选项列表(包括一些明显不推荐的黑客技巧)。看起来有几种方法可以将MIME类型映射到URI,但没有一种被广泛接受或采用。我倾向于使用IANA URL,例如https://www.iana.org/assignments/media-types/text/csv来表示“text/csv”。 - Jakob
1
@Jakob Frankly 在大多数使用 MIME 类型的情况下,人们只是将它们写成字符串,所以没有太多关注 URI 的必要。个人在我的项目中选择了 uri4uri,因为它是语义化的(即使从 image/svg+xml;charset=utf-8 这样的东西中也可以得到丰富的描述)。我们只需要让更多的人使用它,就会没问题的 ;) - IS4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接