3

以下使用WikidataREST 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 FC2017 年伊斯坦布尔夜总会袭击),会显示正确的详细程度(即第一种情况是 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)
4

1 回答 1

4

Wikidata 通过存储有关每个 的附加信息解决了这个问题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,表示年份此处列出了其他可能的精度:

精度代码分别为0:十亿年,1:亿年,3:百万年,4:十万年,5:万年,6:千年,7:世纪,8:十年,9:年,10 :月,11:日,12:小时,13:分钟,14:秒。

如果您尝试使用伊斯坦布尔查询,您将得到一个timePrecision等于 11: 的日期,正如预期的那样。

如果我们可以只写肯定会更简单timePrecision(?date),但这就是生活,至少我们有一个解决方案。

于 2017-04-20T09:29:56.117 回答