Тайм-аут WikiData SPARQL с вложенным запросом + служба меток + НЕОБЯЗАТЕЛЬНО - PullRequest
0 голосов
/ 24 мая 2018

Пытаясь ответить на этот вопрос: Как отфильтровать результаты викиданных на конкретном языке , я столкнулся со следующей проблемой:

В некоторых странах больше, чем один капитал .Этот запрос случайным образом выбирает только одну заглавную букву на страну:

SELECT ?country (sample(?capital) as ?aCapital) WHERE {
    ?country wdt:P31 wd:Q3624078.  
    FILTER NOT EXISTS {?country wdt:P31 wd:Q3024240} # not a former country
    ?country wdt:P36 ?capital.
} 
GROUP BY ?country 

Попробуйте здесь

Однако при попытке добавить метки и координаты время запроса истекает:

SELECT ?country ?countryLabel ?aCapital ?aCapitalLabel ?coords WHERE {
  OPTIONAL {?aCapital wdt:P625 ?coords.}
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
  {
    SELECT ?country (sample(?capital) as ?aCapital) WHERE {
    ?country wdt:P31 wd:Q3624078.  
    FILTER NOT EXISTS {?country wdt:P31 wd:Q3024240} # not a former country
    ?country wdt:P36 ?capital.
  } 
  GROUP BY ?country 
}
                    }
ORDER BY ?countryLabel
LIMIT 1000

Попробуйте здесь

1 Ответ

0 голосов
/ 27 мая 2018

После комментариев By @AKSW Выше - OPTIONAL в SPARQL - это left join.

Переупорядочение подзапроса и OPTIONAL решает проблему:

SELECT ?country ?countryLabel ?aCapital ?aCapitalLabel ?coords WHERE {
  {
    {
      SELECT ?country (sample(?capital) as ?aCapital) WHERE {
      ?country wdt:P31 wd:Q3624078.  
      FILTER NOT EXISTS {?country wdt:P31 wd:Q3024240} # not a former country
      ?country wdt:P36 ?capital.
    } 
    GROUP BY ?country 
  }
  OPTIONAL {?aCapital wdt:P625 ?coords.}
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
                    }
ORDER BY ?countryLabel
LIMIT 1000

Попробуйте здесь .

Обратите внимание, что для сохранения правильного синтаксиса необходимо добавить дополнительный { + }.

См. Также: SPARQL Необязательный запрос

...