通过Wikidata查询服务提取条目DOI时遇一致性问题
问题1:部分条目用
wdt:P356无法获取DOI(如Q67940907) - 原因:Wikidata中DOI的存储分两种场景:
- 直接作为条目的主属性——这种情况用
wdt:P356可直接查询到结果 - 存储在某个声明的引用节点中——
wdt:前缀仅识别条目的主属性值,会忽略引用、限定这类附属数据,因此查不到
- 直接作为条目的主属性——这种情况用
- 解决查询:通过
UNION合并两种场景的结果,覆盖所有可能的DOI存储位置:
SELECT DISTINCT ?doi WHERE { wd:Q67940907 wdt:P356 ?doi. UNION { wd:Q67940907 ?p ?statement. ?statement prov:wasDerivedFrom ?refNode. ?refNode pr:P356 ?doi. } }
- 说明:
DISTINCT用于去重,若确定不会出现重复结果可移除。
问题2:提取异牡荆素(Q3155636)所属类群参考文献DOI结果不全
- 原因:原查询存在两个限制:
- 强制要求引用包含
P248(参考来源条目),但大量参考文献直接将DOI存储在引用节点中,未关联其他条目 - 仅查询
P248关联条目的DOI,漏掉了直接存储在引用节点中的DOI
- 强制要求引用包含
- 优化后的查询:
SELECT ?item ?refDOI ?statement WHERE { VALUES ?item { wd:Q3155636 } ?item p:P703 ?statement. ?statement prov:wasDerivedFrom ?refNode. # 同时匹配两种DOI存储方式:引用节点直接存储的DOI、引用来源条目关联的DOI OPTIONAL { ?refNode pr:P356 ?refDOI } OPTIONAL { ?refNode pr:P248 ?refSource. ?refSource wdt:P356 ?refDOI } # 过滤无DOI的结果(不需要可删除此行) FILTER(BOUND(?refDOI)) SERVICE wikibase:label { bd:serviceParam wikibase:language "en,de,fr". } } LIMIT 10000
- 关键改动:
- 将
?refNode pr:P248 ?refSource从必填改为可选,避免过滤掉未关联来源条目的引用 - 新增直接从引用节点提取DOI的逻辑
- 用
FILTER(BOUND(?refDOI))仅保留有DOI的结果,剔除空值
- 将
额外提示
wdt:是简化属性路径,仅返回条目主属性;p:用于访问声明本身,pr:用于访问引用节点内的属性,注意区分使用- 若结果存在重复,可在
SELECT后添加DISTINCT去重 - 部分引用可能使用PMID等其他标识符,需扩展查询可匹配对应属性
内容的提问来源于stack exchange,提问作者A. Bollans
相关产品推荐
相关产品推荐

