Как проверить тройку существует или нет? - PullRequest
2 голосов
/ 27 марта 2019

Во-первых, я собирался выразить запрос, например COUNT(?sub) AS ?sub_exists, и проверить, равен ли ?sub_exists 0 или нет, с помощью счетного числа.Однако этот запрос занимает слишком много времени, поэтому иногда он занимает больше времени ожидания.Поэтому я во-вторых попытался изменить функцию, как показано ниже.Но это также занимает все время, считая ?sub и, что еще хуже, значения ?sub_exists не назначаются.

Есть ли альтернативный способ выразить запрос на , просто отметив тройной ?sub wdt:P31/wdt:P279* ?s или нет, и получить его флаг соответственно без двух больших затрат времени?

SELECT ?s ?sub_exists
WHERE {
  VALUES ?s {wd:Q5}
  ?sub wdt:P31/wdt:P279* ?s
  BIND(IF(COUNT(?sub) > 0,1,0) AS ?sub_exists)
}
GROUP BY ?s ?sub_exists 

1 Ответ

3 голосов
/ 27 марта 2019

SPARQL предоставляет хорошую альтернативу!ASK вернет true или false, если шаблон существует или нет, соответственно.

Вот рабочий пример:

PREFIX wdt: <http://www.wikidata.org/prop/direct/>

ASK  {
  ?sub wdt:P31/wdt:P279* ?s
}
...