引言
和学术写作以及参考文献打交道,自然离不开 DOI。DOI 是 Digital Object Identifier 的缩写,代表了对于指定内容的一个唯一标记。这一篇就来探讨一下什么是 DOI,为什么要 DOI, 和怎么用 DOI。
DOI what
DOI 狭义地讲就是一个字符串,一个字符串对应唯一一个电子资源。这里的电子资源,既可以是书籍,文章,又可以是影像,音乐甚至是数据,或者任何网络资源可以访问到的内容。当然实际上,主要有科技文献和很少部分的政府文档,采用了 DOI 的标记方法。也有一些多媒体资源采用了 DOI,也即 EIDR。
DOI 标记的格式为 A/B
,其中 A 为登记者的标记,而 B 为对应的具体内容的标记。事实上,这一运作模式几乎和 DNS 的域名解析系统一模一样,可以把 DOI 看作建在 http 协议上的,更高层的 DNS 解析协议。其中的 A 部分就相当于域名的 .com
,.org
的地位,而 B 部分则相当于 baidu
,google
的地位,用来指向更具体的内容。只不过在 DOI 系统里,只有这两级标记,而不能像 DNS 协议一样,还可以继续向下添加子域名,比如 www
,app
等。但 DOI 两级标记之内还是可以有逻辑层级,这种通常用 .
来隔开。注意所有 DOI 号都是以 10.
开头的。举个 DOI 的具体例子,比如 doi:10.1103/PhysRevB.96.241111
,这就对应了一篇文献的 DOI 号码。这种写法也是 DOI 官方推荐的写法。不过 CrossRef 作为学术期刊出版商选择的主要 DOI 注册商,则推荐直接以网址的方式表示 DOI 号,也即 https://doi.org/10.1103/PhysRevB.96.241111
。以 dx
为子域名的 DOI 链接,也即以 dx.doi.org/
开头的 DOI 解析不推荐,但仍被服务器支持解析。
对于一篇文献,在其发表的期刊网站的页面或者文章的 pdf 中,通常都可以在比较显眼的地方找到 DOI 号。如果实在找不到,可以去 CrossRef 按照文章的标题,作者等元数据直接搜索筛选相应的文献,在其对应的搜索项上,就附有了相应的 DOI。如果这里还是找不到,那么很大可能这篇文章就是没有 DOI 的,这种情况可能出现在一些较老的文章和较冷的期刊上。有些偏门和古老的期刊,本来就不给发表的文章分配 DOI 号,因为这种期刊的出版商通常都没申请 DOI 注册商。反之,通过 DOI 号来查找文献就更容易了,这也是 DOI 设计的核心意义所在。只需要在以 10.
开头的 DOI 号前加上 https://doi.org/
补充成完整的 URL 即可。访问该 URL 时,将会自动跳转到相应的期刊出版商对应文章的页面。
DOI why
DOI 的出现,最早就是为了解决网络上的内容 URL 地址不稳定的问题。网络上的内容,由于各种各样的原因(网址变更,网站迁移,网站重构或下线),同一资源对应的 URL 很容易发生变化。因此如果相应内容只记录 URL,那么很可能出现一段时间后就无法访问的问题。DOI 作为内容的唯一标记符,目的就是避免 URL 的以上缺点,使得只需要记下相应内容的 DOI 号,就可以总是能访问到相应的资源,而不论原来的网址是否发生了变化。这其实代表了两种不同的哲学,URL 是基于路径的,我们不管那个路径存放了什么,告诉对应网站服务器 URL,服务器就会显示对应路径的内容。而 DOI 是基于内容的,我们不管这个内容的具体地址是什么,告诉 DOI 解析服务器 DOI 号,就会自动重定向到包含相应内容的网页。至于怎么界定内容,完全取决于出版商或发行者这级的 DOI 注册,既可以一整套书注册一个 DOI,也可以每一章都注册相应的 DOI。说到底,每个 DOI 只不过是对应了一个具体的网页 URL 跳转,只要钱足够多,可以为任何网页注册 DOI。DOI 这一系统本身并未给出何种内容何种形式注册 DOI 的规范。比如每一个 RFC 也都可以通过 DOI 号来访问,形式为 doi:10.17487/rfc1234
,其中 1234 替换为对应的 RFC 号码。
基于 DOI 的目的,现在期刊引用文献时,给出的文献链接都是以 DOI 链接的形式给出。也就是文献的链接并不使用 https://journals.aps.org/prb/abstract/10.1103/PhysRevB.96.241111
的格式,而是使用 https://doi.org/10.1103/PhysRevB.96.241111
的格式。这样可以确保之后 APS 重新设计其网站,使得访问 URL 发生变化时,比如 abstract 变为 summary,DOI 的链接通过 DOI 服务器的 redirect 还是可以访问到正确的网址和内容,而很明显前者链接访问将出现 404。当然事实上,APS 网站的设计还有额外的复杂因素,因为其网站本身对于文章的链接就已经有一层重定向了,这我们将在下面看到。
DOI how
了解了 DOI 的规则和使用的原因,我们来看其是怎么实现的。整个 DOI 系统是基于 handle system 实现的,后者实际上是 DOI 的一个超集,就是一整套用来保证网页有不依赖于 URL 的唯一标记的协议。这一系统在 RFC 3650,RFC 3651 和 RFC3652 中进行了定义和规范。最简单的理解整个 handle system 就是一个 http 协议上的 DNS 系统。其地址的分配,查询甚至服务器缓存,各方面的行为和 DNS 协议神似。简单来讲,在 International DOI Foundation 之下,有一些一级的 DOI 注册商,其名单见这里。这些一级注册商基于地域和分工的不同,负责受理相关的出版商和机构作为下层的 DOI 注册商。这些注册商的信息和编号就构成了 DOI 号 /
前的部分。而 /
后的内容标识码部分则由下层的 DOI 注册商具体负责和分配。如果有人请求解析相应的 DOI 时,过程也和 DNS 相似,如果 doi 的服务器没有相应的缓存,则按照 DOI 中的前缀相应注册商的信息,前往相应注册商的服务器求请求对应内容,直到最后找到相应的 URL 来返回给客户端进行网页重定向。因此所谓 handle system 就是把 DNS 协议里的域名和 ip 地址的关系变成了这里的 DOI 和 URL 的关系。
当然这一中心化的机制,就导致了和注册域名需要花钱一样,出版商为文章分配 DOI 也是需要花钱的。最典型的 CrossRef 的价码可以参考 [4]。这一价位大约在一篇文章一美元的数量级,此外出版商每年还需交 275 到 50000 美元不等的年费给 CrossRef。这一费用说高不高,说低不低,因此 arXiv 的预印本,不会分配 DOI 号。一来,一旦文章发表,期刊出版商会分配 DOI 号,这样相似内容两个 DOI 号会造成混乱;二来,可能就在于 arXiv 本来就是公益性质的,再给每个月一万多篇文章都分配上 DOI 号,这公益做的就太烧钱了。这一方面的讨论,可以参考 这里。里面的这句话很有意思:
The fact that someone is making money selling numbers to mathematicians makes me sad
当然这句话是片面的,DOI 系统不只是分配号码,人家还管售后,通过提供服务器用来解析 DOI 号码的服务,才使得 DOI 有了价值。一个唯一的标记本身没有什么价值,有价值的是通过这一标记可以准确的找到相应的内容。虽然根据每年分配的 DOI 号对应的收入,我觉得是远远超过解析 DOI 服务需要的云服务器的维护费用。而且你还完全可以直接用 google 完成相应 DOI 对应内容的搜索,甚至反应速度要比 DOI 网站的解析服务快得多。
关于 DOI 系统的一些有趣的数据,可以参考这里。迄今为止已经注册了超过5000家 DOI 分配商。DOI 的服务器每年处理超过50亿次解析。
我们从客户端的角度,看一下 DOI 服务的利用。
$ curl -v https://doi.org/10.1103/PhysRevB.96.241111
* Trying 2606:4700:20::6819:ae09...
* Connected to doi.org (2606:4700:20::6819:ae09) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
* Server certificate: ssl388811.cloudflaressl.com
* Server certificate: COMODO ECC Domain Validation Secure Server CA 2
* Server certificate: COMODO ECC Certification Authority
* Server certificate: AddTrust External CA Root
> GET /10.1103/PhysRevB.96.241111 HTTP/1.1
> Host: doi.org
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 302
< Date: Mon, 05 Nov 2018 13:12:02 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 187
< Connection: keep-alive
< Set-Cookie: __cfduid=d62dcc45bf5fa2646bf781ee0c1705a521541423522; expires=Tue, 05-Nov-19 13:12:02 GMT; path=/; domain=.doi.org; HttpOnly
< Expires: Mon, 05 Nov 2018 13:20:26 GMT
< Location: https://link.aps.org/doi/10.1103/PhysRevB.96.241111
< Vary: Accept
< Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
< Server: cloudflare
< CF-RAY: 474f91d638547760-LAX
<
<html><head><title>Handle Redirect</title></head>
* Connection #0 to host doi.org left intact
<body><a href="https://link.aps.org/doi/10.1103/PhysRevB.96.241111">https://link.aps.org/doi/10.1103/PhysRevB.96.241111</a></body></html>
可以发现,doi.org
的服务器使用了 cloudflare 的 cdn 服务,不知道这是不是其在国内速度很慢的罪魁祸首。我们看到,直接访问对应的网页,返回的是 302 重定向,符合预期,对应网址为 https://link.aps.org/doi/10.1103/PhysRevB.96.241111
。这一网址是 aps 网站内部的跳转链接,其会进一步跳转到之前说的 https://journals.aps.org/prb/abstract/[DOI]
这一真实的内容页面。对应细节如下。
$ curl -v https://link.aps.org/doi/10.1103/PhysRevB.96.241111
* Trying 54.208.19.93...
* Connected to link.aps.org (54.208.19.93) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: *.aps.org
* Server certificate: COMODO RSA Domain Validation Secure Server CA
* Server certificate: COMODO RSA Certification Authority
* Server certificate: AddTrust External CA Root
> GET /doi/10.1103/PhysRevB.96.241111 HTTP/1.1
> Host: link.aps.org
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 302 Found
< Server: nginx/1.13.6
< Date: Mon, 05 Nov 2018 13:14:28 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 0
< Connection: close
< Location: https://journals.aps.org/prb/abstract/10.1103/PhysRevB.96.241111
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
<
* Closing connection 0
这一两级跳转机制,进一步抽象了 aps 网站的 URL 规则,使得注册分配 DOI 时,只需绑定 link.aps.org/doi/[DOI]
这样形式的链接即可。其他部分则进一步在网站的内部逻辑中实现跳转,管理和重构都会更加方便。
更进一步的,DOI 服务还可以以 Restful API 的形式利用,可以参照下面的例子。
$ curl https://doi.org/api/handles/10.1103/PhysRevB.96.241111
{"responseCode":1,
"handle":"10.1103/PhysRevB.96.241111",
"values":[{"index":1,"type":"URL",
"data":{"format":"string","value":"https://link.aps.org/doi/10.1103/PhysRevB.96.241111"},"ttl":86400,"timestamp":"2017-12-21T16:13:46Z"},{"index":700050,"type":"700050","data":{"format":"string","value":"20171221160946"},"ttl":86400,"timestamp":"2017-12-21T16:13:46Z"},{"index":100,"type":"HS_ADMIN","data":{"format":"admin","value":{"handle":"0.na/10.1103","index":200,"permissions":"111111110010"}},"ttl":86400,"timestamp":"2017-12-21T16:13:46Z"}]}
这一 API 返回数据的具体含义,可以参考这里。需要重点关注的就是 data
中的 value
,即是302重定向的链接,也即内容真正所在的 URL。
因为 DOI 不过是 handle system 的 namespace 以 10.
开头的子集,那么相应的 API 和解析链接,也可以使用 handle system 的解析服务器,对应的网址为 hdl.handle.net/[DOI]
和 hdl.handle.net/api/handles/[DOI]
。值得一提的是,还有很多第三方的 DOI 解析服务器中。其中比较有特色的是 http://doai.io/[DOI]
,这一解析服务,并不按照真正的 DOI 协议去请求指定链接,而是优先尝试对应内容的开源(免费)版本,也就是其并不是标准的 DOI 解析服务。比如当请求网址 http://doai.io/10.1103/PhysRevB.96.241111
时,会跳转到 https://arxiv.org/abs/1610.08975
这一 arXiv 网页,而非官方的 APS 网站版本。
DOI metadata
除了 DOI 简单的地址重定向服务,注册于 Crossref 的出版商(大多数学术期刊),还会为对应的 DOI 文章提供 metadata 的信息和服务,这可以通过 Crossref 的 RESTFUL API 获得,其详细文档可参考 [6]。如果使用 python 等语言开发利用该 API,有更现成的 wrapper 库,[6] 里都有提及。注意到并不是所有 DOI 都可以通过 Crossref 的 API 拿到 metadata,这要求分配对应 DOI 号的出版商是注册在 Crossref 的。
例如直接请求 https://api.crossref.org/works/10.1103/PhysRevB.96.241111
可以获取信息非常丰富的 json,也可以按照文档,通过 query 和 path 等方式进一步筛选请求的字段。返回结果 json 的主要字段包括 status
, message-type
,message-version
这几个字段规定了返回信息的格式和有效性。publisher
给出了出版商的名称,比如 American Physical Society。license
包含若干子字段,给出了文章的版权信息。funder
给出了文章背后支持的基金机构,比如 Ministry of Science and Technology of the People‘s Republic of China,或是 National Nature Science Foundation of China 等。注意到这些基金机构也都分配了唯一的 DOI
标识,可以进一步通过 API 获取相关信息。type
字段给出文章的性质,比如 journal-article
。title
字段给出文章的题目,author
及其子字段包含了作者的姓名和是否是第一作者的信息。reference
及其子字段给出了文章引用的所有文章的信息。language
给出了文章的语言信息。此外信息还包含了发表文章的出版商和期刊的一些 metadata。总之,Crossref 的 API 实现了通过一个 DOI 号就拿到必要的信息,这对于文献管理相关的应用和开发,无疑是非常有用的 API。
DOI comparison
最后比较一下 DOI 规范和互联网上其他一些标准化标记的规范。
首先就是 arXiv 号,上面提到 arXiv 不自动分配 DOI,关于 arXiv 号的规范,有过几次改版,详情可以参考 [5]。
此外就是标记出版图书印刷品的 ISBN 书号,和对应杂志类出版物的 ISSN 号。ISBN 和 DOI 本身没有什么关系,不过如果书籍出版商同时又注册了 DOI 分配资格,有些出版社就会将对应书籍电子资源的 DOI 号的后半部分设置成和 ISBN 相同。这一用 ISBN 号来作为 DOI 标记的规范被称为 ISBN-A。详情可以参考这里。注意到这一转换规范中,ISBN 码的前半部分会进入 DOI 的 /
之前,并且转换时要注意到 ISBN 码不同部分的变长特征。
References
- DOI handbook
- The handle system: a technical review
- RFC3650, RFC3651, RFC3652
- DOI fees
- Understanding the arxiv identifier
- CrossRef REST API
EOF