我正在尝试查询某些属性的频率Wikidata https://query.wikidata.org,使用 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:") )
但它超时了。
- 我怎样才能算distinct答案数量?
我试过SELECT (COUNT(DISTINCT ?rid) AS ?count)
使用上面的查询,但再次超时。
值开头为t
被“斯科莱化”未知值 https://www.wikidata.org/wiki/Help:Statements#Unknown_or_no_values(参见,例如,Q2423351 https://www.wikidata.org/wiki/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 https://www.wikidata.org/wiki/Q746411 is a subclass https://www.wikidata.org/wiki/Property:P279 of WD:Q48270 https://www.wikidata.org/wiki/Q48270, etc.
-
所有“非正常”性别:
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 https://www.wikidata.org/wiki/Q5或者将它们视为不不同的——但由于性能原因,后者更可取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)