什么是以 "t" 开头的值以及如何在计数时忽略它们
What are values starting with "t" and how to ignore them for counting
我正在尝试使用 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)
,但再次超时。
对于未知性别的人,以 t
开头的值是 "skolemized" unknown values (see, e.g., Q2423351。
为了提高性能,我建议您将查询分为三个部分:
所有 "normal" 性别:
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 is a subclass of wd:Q48270等
所有 "non-normal" 性别:
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)"unknown" 性别:
SELECT (COUNT(?qid) AS ?count)
WHERE {
?qid wdt:P31 wd:Q5.
?qid wdt:P21 ?rid.
FILTER (!isURI(?rid))
}
事实上,在您的情况下,计算不同 wd:Q5 或计算不不同并不是很重要,但由于性能原因,后者更可取。
我正在尝试使用 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)
,但再次超时。
对于未知性别的人,以 t
开头的值是 "skolemized" unknown values (see, e.g., Q2423351。
为了提高性能,我建议您将查询分为三个部分:
所有 "normal" 性别:
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 is a subclass of wd:Q48270等
所有 "non-normal" 性别:
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)"unknown" 性别:
SELECT (COUNT(?qid) AS ?count) WHERE { ?qid wdt:P31 wd:Q5. ?qid wdt:P21 ?rid. FILTER (!isURI(?rid)) }
事实上,在您的情况下,计算不同 wd:Q5 或计算不不同并不是很重要,但由于性能原因,后者更可取。