Wikidata 查询服务 - 获取页面的创建日期
Posted
技术标签:
【中文标题】Wikidata 查询服务 - 获取页面的创建日期【英文标题】:Wikidata query service - getting the creation date of a page 【发布时间】:2020-04-23 06:00:13 【问题描述】:我正在寻找一种方法来获取英语***上的所有电影及其创作日期。 对我来说,电影是一个附有 IMDB ID 的页面。 所以,这是我目前的查询:
SELECT DISTINCT ?item_label ?imdb_id (year(?dateCreation) as ?AnneeCreation) WHERE
?item wdt:P345 $imdb_id.
filter STRSTARTS(?imdb_id,"tt")
OPTIONAL
?item wdt:P571 ?dateCreation.
SERVICE wikibase:label bd:serviceParam wikibase:language "en".
?article schema:about ?item ; schema:isPartOf <https://en.wikipedia.org/> ; schema:name ?item_label
这样做的问题是大多数页面没有 P571 属性, 所以我想知道是否有更好的方法来获取创建日期? 也许由于修订历史或其他原因,我找不到这样的选择。
任何帮助将不胜感激!
【问题讨论】:
wdt:P571
是实体本身创建日期的属性,而不是它们相应的***文章创建。据我所知,维基数据中没有这样的信息,至少如果你通过?article ?p ?o .
三重模式检查,你不会得到任何东西。那种元数据。
我可以看到这些信息的唯一方法是通过 Wikidata bd:serviceParam wikibase:api "Generator" .
service。您可以尝试在 SPARQL 查询中使用它。
至少你可以得到最后一次触摸的日期。只是一个草图:SELECT ?item ?pageid ?date WHERE ?item wdt:P31 wd:Q11424 . ?item wdt:P345 $imdb_id. SERVICE wikibase:mwapi bd:serviceParam wikibase:endpoint "en.wikipedia.org" . bd:serviceParam wikibase:api "Generator" . bd:serviceParam mwapi:generator "search" . bd:serviceParam mwapi:gsrsearch "hastemplate:\"infobox film\"" . bd:serviceParam mwapi:gsrlimit "max" .
bd:serviceParam wikibase:limit 50 . bd:serviceParam mwapi:gcmprop "ids|title|type|touched" . ?item wikibase:apiOutputItem mwapi:item . ?pageid wikibase:apiOutput "@pageid" . ?ns wikibase:apiOutput "@ns" . ?date wikibase:apiOutput "@touched" . LIMIT 15
更清楚地了解您正在尝试做什么以及可能的原因,将帮助您获得更好的答案。如果您确实需要 Wikipedia 页面的创建日期,这似乎只能通过每个 Wikipedia 页面的历史页面获得,该页面当前不是 - 但可以成为每个 Wikipedia 页面的 DBpedia 数据提取的一部分。如果您真的想要 Wikipedia 页面主题(即电影)的创建日期,那只是一个不同的 Wikidata 属性。
【参考方案1】:
因此,正如 cmets 所指出的,Wikidata 属性(以及一些罕见的示例,例如特色文章标志)描述了基本概念,而不是 Wikipedia 页面元数据。正如@AKSW 指出的那样,与 Wikipedia API 交谈的能力有限,但我的理解是,这对于大量文章来说效果不佳(注意示例代码中有 LIMIT 50)
但是,一切都没有丢失!我最近在Gender and Deletion on Wikipedia 上为大量文章制定了一种大规模执行此操作的方法,使用了一些横向思维。
第一步:找出您的 Wikidata 查询。带有 tt 前缀的 IMDB 标签可能适用于电影以外的事物(例如电视剧集、体育广播),因此另一种方法可能是进行 P31/P279 类型/类搜索以查找所有“电影或电影子类”的事物.您还需要添加一个明确表示“并且只有英文 Wikipedia 中的文章”的过滤器,我看到您已经完成了。请注意,这为您提供了 WP 文章的名称,而不是 Wikidata 项目的“标签”,这是不同的,因此您可以删除(耗时的)标签服务条款。你最终会得到类似https://w.wiki/FH4(这仍然使用 tt- 前缀方法并获得 180k 结果)或 https://w.wiki/FH8(P31/P279 过滤器加上 tt- 前缀,136k 结果)之类的东西
运行此查询,将结果 TSV 保存在某处,然后继续进行第 2 步。我们将在此处使用的工具是 PetScan,它旨在链接来自***类别、***元数据、维基数据查询等的数据。
将 SPARQL 查询输入选项卡 4(“其他来源”)并在此选项卡底部说“使用 wiki:enwiki”。这将强制它输出与此查询链接的 Wikipedia 文章的数据。
现在点击“做”,稍等片刻,(我测试它花了大约 100 秒)然后检查结果。你会看到我们得到了标题(WP 文章)、页面 ID、命名空间(希望总是“(文章)”、以字节为单位的大小和最后接触的日期。这些都不是创建日期...
...除了其中一种是。 PageID 是按顺序分配的,因此它们本质上是创建时间的时间戳。这里有一些关于边缘情况的细微差别 - 例如,如果我在 2010 年创建了一个名为“Example (film)”的重定向,并在 2015 年手动编辑该重定向以成为一篇名为“Example (film)”的真实文章,它将显示为创建于 2010 年。对于删除和重新创建的页面,或者具有复杂页面移动历史的页面也可能会出现奇怪的结果(不过,直接的页面移动应该保留 ID)。但是,一般来说,对于 95% 的项目,pageID 将反映它在维基上首次创建的时间。例如,创建了 431900000 at 11.14am on 1 July 2014; 531900000 已创建at 6.29pm on 14 February 2017;等等。
回到 PetScan - 让我们拉下所有这些项目。在 PetScan 中,转到最后一个选项卡并选择 TSV。重新运行搜索并保存结果文件。
现在,我们有一个 TSV,其中包含 Wikidata ID、IMDB ID 和 WP 页面标题(以及您想从 WD 查询中恢复的任何其他内容);我们还有另一个带有 WP 页面标题和页面 ID 的内容。您可以使用 WP 页面标题将它们链接在一起,让您从“Wikidata 中的结果”转到“页面 ID”。清理它们并按照你喜欢的方式链接它们 - 我是在 bash 中完成的,你可能想要使用更明智的东西,比如 python。
现在您可以将 PageID 转换为创建日期。对于我所做的工作,我只对六个月的垃圾箱感兴趣,所以我只是计算出每年 1 月 1 日和 7 月 1 日创建的任意 pageID,并计算它们之间的 ID。您可以做同样的事情,或者使用 API 来查找各个 pageID 并返回创建时间戳 - 完全取决于您想要获得的内容。
这一切都比仅仅使用查询服务要复杂一些,它“可能”会为一两篇历史复杂的文章提供虚假的结果,但它基本上会让你做你最初要求的事情。
【讨论】:
以上是关于Wikidata 查询服务 - 获取页面的创建日期的主要内容,如果未能解决你的问题,请参考以下文章