Python Wikidata查询服务-获取页面的创建日期

Python Wikidata查询服务-获取页面的创建日期,python,sparql,wikipedia-api,wikidata,imdb,Python,Sparql,Wikipedia Api,Wikidata,Imdb,我正在寻找一种方法,在英文维基百科上获取所有的电影,以及它们的制作日期。 我的电影是一个带有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 wd

我正在寻找一种方法,在英文维基百科上获取所有的电影,以及它们的制作日期。 我的电影是一个带有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
    }
选择不同的项目标签imdb id(年份(?创建日期)作为AnneCreation),其中{
?项目wdt:P345$imdb\U id。
过滤器STRSTARTS(?imdb_id,“tt”)
可选的{
?项目wdt:P571?日期创建。
}
服务wikibase:标签{bd:serviceParam wikibase:语言“en”。}
?文章模式:关于?项目;模式:isPartOf;模式:名称?项目标签
}
问题是大多数页面没有P571属性, 所以我想知道是否有更好的方法来获取创建日期? 也许是因为修订历史或其他原因,我找不到这样的选择


任何帮助都将不胜感激

因此,正如评论所指出的,Wikidata属性(带有一些罕见的示例,如特色文章标志)描述了基础概念,而不是Wikipedia页面元数据。正如@AKSW所指出的,与维基百科API对话的能力是有限的,但我的理解是,这对于大量的文章来说并不太好(注意示例代码中的限制为50)

然而,一切都没有失去!我用一点横向思维,为最近在中发表的大量文章制定了一种大规模的方法

第一步:找出你的Wikidata查询。tt前缀的IMDB标签可能适用于电影以外的事物(例如电视剧、体育广播),因此另一种方法可能是执行P31/P279类型/类搜索,以查找所有“电影或电影的子类”。您还需要添加一个明确显示“并且只有英文维基百科中的一篇文章”的过滤器,我看您已经这样做了。请注意,这将为您提供WP文章的名称,而不是Wikidata项的“标签”,这是不同的,因此您可以删除(耗时的)标签服务子句。您将得到类似的结果(仍然使用tt-prefix方法并获得180k结果)或(P31/P279过滤器加tt-prefix,136k结果)

运行此查询,将结果保存到TSV的某个位置,然后继续执行步骤2。我们将在这里使用的工具是,它旨在链接来自Wikipedia类别、Wikipedia元数据、Wikidata查询等的数据

将SPARQL查询输入到选项卡4(“其他源”),并在该选项卡底部说“使用wiki:enwiki”。这将迫使它输出与此查询链接的维基百科文章上的数据

现在点击“DoIt”,稍等片刻(我测试它时花了大约100秒),然后检查结果。您将看到我们得到了标题(WP文章)、页面ID、名称空间(希望总是“(文章)”、大小(以字节为单位)和最后接触的日期。这些都不是创建日期

…除了其中一种是。PageID是按顺序分配的,因此它们基本上是创建时间戳。关于边缘情况,这里有一些细微差别-例如,如果我在2010年创建了一个名为“示例(电影)”的重定向,并在2015年手动编辑重定向,使其成为一篇名为“示例(电影)”的真实文章,它将显示为2010年创建的页面。对于删除和重新创建的页面,或具有复杂页面移动历史记录的页面,也可能会出现奇怪的结果(不过,直接的页面移动应该保留ID)。但是,一般来说,对于95%的项目,pageID将反映它首次在Wiki上创建的时间。例如,创建了431900000;创建了531900000;等等

回到PetScan-让我们下拉所有这些项目。在PetScan中,转到最后一个选项卡并选择TSV。重新运行搜索并保存结果文件

现在,我们有一个带有Wikidata ID、IMDB ID和WP页面标题(以及您希望从WD查询中恢复的任何内容)的TSV;还有一个带有WP页面标题和页面ID的TSV。您可以使用WP页面标题将它们链接在一起,让您从“Wikidata中的结果”转到“页面ID”.清理这些文件并按您喜欢的方式链接它们-我在bash中完成了这项工作,您可能希望使用更合理的方法,如python

现在您可以将PageID转换为创建日期。对于我所做的工作,我只对6个月的BIN感兴趣,所以我只计算出每年1月1日和7月1日创建的任意PageID,并计算它们之间的ID。您可以做同样的事情,或者使用API查找单个PageID并获取创建时间戳-具体取决于什么是创建时间戳不是你想得到的


这比仅仅使用查询服务要复杂一点,它“可能”会为一篇或两篇具有复杂历史记录的文章提供虚假结果,但它基本上可以让您完成最初要求的操作。

wdt:P571
是实体本身创建日期的属性,而不是对应的属性Wikipedia文章创建。据我所知,Wikidata中没有此类信息,至少如果你通过
?article?p?o.
三重模式进行检查,你不会得到任何w.r.t.那种元数据。我可以查看这些信息的唯一途径是通过Wikidata
bd:serviceParam wikibase:api“生成器”.
。您可以尝试在SPARQL查询中使用它。至少您可以得到类似上次触摸日期的内容。只是一个草图:
SELECT?item?pageid?date,其中{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:GSRLMIT“max”。
bd:serviceParam wikibase:limit 50。bd:serviceParam mwapi:gcmprop“ids”\124; title\124; type\124;.?项目wikibase:apiOutputItem mwapi:item.?页面ID wikibase:apiOutput“@pageid”?ns wikibase:apiOutput“@ns”?日期wi