RDF 允许使用 typed literals 来指定字符串值的数据类型。这通常用于 XML Schema 数据类型,例如
xsd:integer
和 xsd: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。是否存在用于 MIME 类型的官方 URI 名称空间并且此类 URI 是否已用于 RDF 类型文字?
没有正式的方法将 MIME 类型用作 RDF(或 XML 模式)数据类型,因为这样的事情意味着什么是模棱两可的——MIME 类型描述了一个 bytes 序列,而 RDF 文字总是一个 Unicode 字符序列.您必须定义一个方法,将词法值转换为字节序列然后进行解释,对于非文本格式,您可能必须从
xsd:base64Binary
或 xsd:hexBinary
开始。除此之外,你的一些例子只是片段,而不是文档本身有效,所以让我们先看看其他选项:
我建议首先为您要支持的格式寻找具体的标识符,但即使那样您也可能有多种选择:
rdf:XMLLiteral
、rdf:HTML
和 rdf:JSON
是官方的,应该用于这些语言中的有效文字。xtypes:Fragment-HTML
、xtypes:Fragment-Markdown
或 xtypes:Fragment-LaTeX
。可能有点模棱两可的是“片段”在这里的确切含义。我认为这意味着像 '<tag attr="a">'^^xtypes:Fragment-XML
这样的东西是有效的,而 '<tag attr="a">'^^rdf:XMLLiteral
不是(它必须是独立的,类似于 application/xml-external-parsed-entity
)。http://dbpedia.org/resource/Markdown
这样的 URI,但这些没有明确定义为数据类型,因此某些处理器可能很难找到它们的定义。tag:yaml.org,2002:yaml
的 YAML 之外,我找不到更多的例子。urn:publicid:%2B:ISBN+0-201-13448-9;Knuth:NOTATION+The+TeXbook:EN
,但这些不再生成(您可以在 here 找到它们的集合)。我不建议使用除
http(s)
之外的任何其他URI方案,因为至少人类应该能够通过HTTP找出它的含义。
如果你想要 MIME 类型的 URI(但不一定用作数据类型),你可以使用像 uri4uri 这样的东西来获得 MIME 类型的 RDF 描述,例如
https://w3id.org/uri4uri/mime/text/markdown
(但请注意 charset
Markdown 需要参数,所以应该是 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
,但除非正式注册,否则这些将无法解析。
我可以想到的另一个选择是为此目的(滥用)使用语言标签而不是数据类型,例如
zxx-Latn-x-md
用于 Markdown 或 zxx-Latn-x-tex
用于 TeX。这绝对不是标准化的(除了 zxx
可用于编程源代码,以及 Latn
用于使用拉丁字母表的文本),我不建议将它用于应该解析的文字 – 想想它会影响文本的呈现,例如选择语法荧光笔。
data:
URIs结合文本和 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!" .