Я пытаюсь запросить частоту определенных атрибутов в Викиданных, используя SPARQL.
Например, чтобы узнать, какова частота различных значений пола, у меня есть следующий запрос:
SELECT ?rid (COUNT(?rid) AS ?count)
WHERE { ?qid wdt:P21 ?rid.
BIND(wd:Q5 AS ?human)
?qid wdt:P31 ?human.
} GROUP BY ?rid
Я получаю следующий результат:
wd:Q6581097 2752163
wd:Q6581072 562339
wd:Q1052281 223
wd:Q1097630 68
wd:Q2449503 67
wd:Q48270 36
wd:Q44148 8
wd:Q43445 4
t152990852 1
t152990762 1
t152990752 1
t152990635 1
t152775383 1
t152775370 1
t152775368 1
...
У меня есть следующие вопросы по этому поводу:
- К чему относятся эти значения
t152...
? - Как я могу игнорировать кортежи, содержащие
t152...
?
Я попробовалFILTER ( !strstarts(str(?rid), "wd:") )
, но время ожидания истекло. - Как мне подсчитать различное количество ответов?
Я попробовалSELECT (COUNT(DISTINCT ?rid) AS ?count)
с приведенным выше запросом, но снова истекло время ожидания.
?rid
? Разве вы не должны посчитать количество людей, то есть?qid
? В противном случае использованиеDISTINCT
всегда будет возвращать 1 в качестве значения. - person UninformedUser   schedule 05.06.2017rid
— это гендерный тип, верно? Что вы хотите, так это количество людей, которые имеют каждый пол, или нет? Тройка, например.:human1 :gender :male .
Конечно, без DISTINCT это работает, но на самом деле вам нужно числоqid
Если вы используетеDISTINCT
дляrid
, по которому вы группируете, то счетчик всегда будет равен 1. - person UninformedUser   schedule 05.06.2017qid
тогда? Просто как подсказка, вы группируете по переменнойqid
- если вы считаете РАЗЛИЧНЫЕ значенияqid
, то это всегда будет 1. Кстати, у меня это работает без таймаута:SELECT ?rid (COUNT(DISTINCT ?rid) AS ?count) WHERE { VALUES ?human {wd:Q5} ?qid wdt:P31 ?human. ?qid wdt:P21 ?rid. } GROUP BY ?rid
- person UninformedUser   schedule 05.06.2017qid
(сокращение от идентификатора запроса) соответствует идентификатору конкретного человека, аhuman
соответствует понятию/типу Q5 (человек) в Викиданных. - person benroth   schedule 05.06.2017FILTER(isURI(?rid))
- person UninformedUser   schedule 05.06.2017SELECT (COUNT(DISTINCT ?rid) AS ?count)
это возвращает 17 для меня - person UninformedUser   schedule 05.06.2017SELECT (COUNT(distinct ?rid) AS ?count)
все еще не дает ожидаемого результата для меня (1 1 1 ... вместо количества разных значений) - person benroth   schedule 06.06.2017GROUP BY
. - person UninformedUser   schedule 06.06.2017DISTINCT
дляrid
, что приведет к 1 значению для каждого пола. В этом случае это должно бытьqid
. - person UninformedUser   schedule 06.06.2017