Улучшить SPARQL для временного диапазона - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь сделать несколько запросов на sparql с помощью программирования на Python, и я застрял ниже. То, что я пытаюсь сделать, - это утверждение запроса временного диапазона каким-то общим образом. Приведите мне пример ниже. Вопрос "Who was the mayor of the new york city in %(YEAR)?" и соответствующий sparql, который я пишу, такой же, как показано ниже. Для дальнего предыдущего диапазона все работает нормально. Но недавний диапазон не работает, потому что у нынешнего мэра нет времени окончания. Другими словами, могу ли я сделать код что-то вроде FIlTER (?v3 has no value or ?v3 > "2011-01-01"^^xsd:dateTime)? Я бы хотел улучшить свой sparql одним запросом в более общем виде, соответствующем вопросам временного диапазона.

Случай 1: Кто был мэром Нью-Йорка в 2011 году? -ok

SELECT DISTINCT ?v ?vLabel ?v2 ?v3
WHERE
{
  wd:Q60 p:P6 ?stmt.
  ?stmt  ps:P6 ?v;
         pq:P580 ?v2;
         pq:P582 ?v3.
  FILTER (?v2 < "2011-01-01"^^xsd:dateTime) # start time
  FILTER (?v3 > "2011-01-01"^^xsd:dateTime) # end time

  SERVICE wikibase:label { bd:serviceParam wikibase:language "ko,en". }
}
ORDER BY DESC (?v2)

Случай 2: Кто был мэром Нью-Йорка в 2016 году? - Нет ответа

SELECT DISTINCT ?v ?vLabel ?v2 ?v3
WHERE
{
  wd:Q60 p:P6 ?stmt.
  ?stmt  ps:P6 ?v;
         pq:P580 ?v2;
         pq:P582 ?v3
  FILTER (?v2 < "2016-01-01"^^xsd:dateTime) # start time
  FILTER (?v3 > "2016-01-01"^^xsd:dateTime) # end time

  SERVICE wikibase:label { bd:serviceParam wikibase:language "ko,en". }
}
ORDER BY DESC (?v2)

1 Ответ

2 голосов
/ 11 апреля 2019

Шаг 1: Получить шаблон запроса для сопоставления, даже если нет значения для «времени окончания».Это можно сделать, используя OPTIONAL для этого тройного шаблона:

OPTIONAL { ?stmt pq:P582 ?v3 }

Шаг 2: Измените фильтр так, чтобы он принимал решения, для которых переменная времени окончания ?v3 не имеет значения.Это можно сделать с помощью функции bound, которая возвращает true, если есть значение, и false в противном случае:

FILTER (!bound(?v3) || ?v3 > "2016-01-01"^^xsd:dateTime) # end time

Полный запрос:

SELECT DISTINCT ?v ?vLabel ?v2 ?v3
WHERE
{
  wd:Q60 p:P6 ?stmt.
  ?stmt  ps:P6 ?v;
         pq:P580 ?v2.
  OPTIONAL { ?stmt pq:P582 ?v3 }
  FILTER (?v2 < "2016-01-01"^^xsd:dateTime) # start time
  FILTER (!bound(?v3) || ?v3 > "2016-01-01"^^xsd:dateTime) # end time

  SERVICE wikibase:label { bd:serviceParam wikibase:language "ko,en". }
}
ORDER BY DESC (?v2)
...