我正在尝试使用SPARQL查询Wikidata中某些属性的频率。
例如,要找出性别的不同值的频率,我有以下查询:
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)
,但又一次超时。答案 0 :(得分:3)
以t
开头的值是" skolemized" unknown values(请参阅,例如Q2423351,了解性别或性别不明的人)。
为了提高性能,建议您将查询分为三个部分:
所有"正常"性别:
SELECT ?rid (COUNT(?qid) AS ?count)
WHERE {
?qid wdt:P31 wd:Q5.
?qid wdt:P21 ?rid.
?rid wdt:P31 wd:Q48264
} GROUP BY ?rid ORDER BY DESC(?count)
请注意,根据维基数据,wd:Q746411是subclass的wd:Q48270等。
所有"非正常"性别:
SELECT ?rid (COUNT(?qid) AS ?count)
WHERE {
?qid wdt:P31 wd:Q5.
?qid wdt:P21 ?rid.
FILTER (?rid NOT IN
(
wd:Q6581097,
wd:Q6581072,
wd:Q1052281,
wd:Q2449503,
wd:Q48270,
wd:Q746411,
wd:Q189125,
wd:Q1399232,
wd:Q3277905
)
).
FILTER (isURI(?rid))
} GROUP BY ?rid ORDER BY DESC(?count)
由于性能原因,我不使用FILTER NOT EXISTS {?rid wdt:P31 wd:Q48264 }
。
全部(即1)"未知"性别:
SELECT (COUNT(?qid) AS ?count)
WHERE {
?qid wdt:P31 wd:Q5.
?qid wdt:P21 ?rid.
FILTER (!isURI(?rid))
}
事实上,在你的情况下,它并不是非常重要 - 计算不同的wd:Q5或计算它们并不明显 - 但后者因性能原因而更为可取。