以下使用Wikidata的REST API的 SPARQL 查询都返回类型xsd:datetime
为 1 月 1 日的日期:
>>> # Inception of Manchester United F.C. = in 1875
>>> wikidata_rest_query("SELECT ?date WHERE { wd:Q18656 wdt:P571 ?date }")
{'head': {'vars': ['date']},
'results': {'bindings': [{'date': {'datatype': 'http://www.w3.org/2001/XMLSchema#dateTime',
'type': 'literal',
'value': '1875-01-01T00:00:00Z'}}]}}
>>> # Istanbul nightclub attack = on January 1st 2017
>>> wikidata_rest_query("SELECT ?date WHERE { wd:Q28094271 wdt:P585 ?date }")
{'head': {'vars': ['date']},
'results': {'bindings': [{'date': {'datatype': 'http://www.w3.org/2001/XMLSchema#dateTime',
'type': 'literal',
'value': '2017-01-01T00:00:00Z'}}]}}
在第一种情况下,日期仅表示“ 1875 年”,而不是字面意义上的 1875 年 1 月 1 日午夜。在第二种情况下,日期实际上是指“ 2017 年 1 月 1 日”,但不是特别指午夜。我会更喜欢“1875”和“2017-01-01”这样的回答。
在浏览这些主题的 Wikidata 页面时(Manchester United FC和2017 年伊斯坦布尔夜总会袭击),会显示正确的详细程度(即第一种情况是 1875,但第二种情况是 2017 年 1 月 1 日),所以它们必须有他们数据库中的正确信息,希望有一种方法可以查询它。
有任何想法吗?
笔记
我尝试了 querying datatype(?date)
,希望看到不同之处,但它xsd:datetime
在两个示例中都返回。
编辑
wikidata_rest_query()
如果你想测试上面的查询,这里是 python 3 代码:
from urllib.request import urlopen, quote
import json
def wikidata_rest_query(query):
url = "https://query.wikidata.org/sparql?query=%s&format=json" % quote(query)
with urlopen(url) as f:
response = f.read().decode("utf-8")
return json.loads(response)