在SparQL中,如何区分2017年和2017年1月1日这样的年份?

时间:2017-04-20 08:39:10

标签: datetime sparql wikidata wikidata-api

使用WikidataREST 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)

1 个答案:

答案 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),那就更简单了,但是至少我们有一个解决方案。

相关问题