使用Wikidata的REST API的以下SPARQL查询都会在1月1日返回xsd:datetime
类型的日期:
>>> # 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'}}]}}
在第一种情况下,日期仅仅意味着“ in 1875 ”,而不是字面意思是1875年1月1日午夜。在第二种情况下,日期实际上意味着“ 2017年1月1日”,但不是特别在午夜。我会更喜欢像“1875”和“2017-01-01”这样的回复。
在浏览这些主题(Manchester United F.C.和2017 Istanbul Night Club Attack)的维基数据页面时,会显示正确的详细程度(即第一种情况下为1875,但第二种情况下为2017年1月1日) ,所以他们必须在他们的数据库中拥有正确的信息,并希望有一种方法来查询它。
有什么想法吗?
注意
我尝试查询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)
答案 0 :(得分:3)
维基达通过存储有关每个xsd:datetime
的其他信息,尤其是timePrecision
来解决此问题:
>>> query = """
... SELECT ?time ?timeprecision ?timezone ?timecalendar WHERE {
... wd:Q18656 p:P571/psv:P571 ?timenode.
... ?timenode wikibase:timeValue ?time.
... ?timenode wikibase:timePrecision ?timeprecision.
... ?timenode wikibase:timeTimezone ?timezone.
... ?timenode wikibase:timeCalendarModel ?timecalendar.
... }
... """
>>> wikidata_rest_query(query)
{'head': {'vars': ['time', 'timeprecision', 'timezone', 'timecalendar']},
'results': {'bindings': [{'time': {'datatype': 'http://www.w3.org/2001/XMLSchema#dateTime',
'type': 'literal',
'value': '1875-01-01T00:00:00Z'},
'timecalendar': {'type': 'uri',
'value': 'http://www.wikidata.org/entity/Q1985727'},
'timeprecision': {'datatype': 'http://www.w3.org/2001/XMLSchema#integer',
'type': 'literal',
'value': '9'},
'timezone': {'datatype': 'http://www.w3.org/2001/XMLSchema#integer',
'type': 'literal',
'value': '0'}}]}}
timePrecision
等于9,表示年。其他可能的精度是listed here:
精确度的代码是0亿年,1:亿 年,3:百万年,4:十万年,5:万 年,6:千年,7:世纪,8:十年,9:年,10:月,11: 一天,12:小时,13:分,14:秒。
如果您尝试伊斯坦布尔查询,您将获得timePrecision
等于11:day的预期。
如果我们只能写timePrecision(?date)
,那就更简单了,但是至少我们有一个解决方案。