什么是以“t”开头的值以及如何忽略它们进行计数

时间:2017-06-05 17:52:21

标签: sparql wikidata blazegraph blank-nodes

我正在尝试使用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),但又一次超时。

1 个答案:

答案 0 :(得分:3)

t开头的值是" skolemized" unknown values(请参阅,例如Q2423351,了解性别或性别不明的人)。

为了提高性能,建议您将查询分为三个部分:

  1. 所有"正常"性别:

    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:Q746411subclasswd:Q48270等。

  2. 所有"非正常"性别:

    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 }

  3. 全部(即1)"未知"性别:

    SELECT (COUNT(?qid) AS ?count) 
    WHERE {
       ?qid wdt:P31 wd:Q5.
       ?qid wdt:P21 ?rid.
       FILTER (!isURI(?rid))
    } 
    
  4. 事实上,在你的情况下,它并不是非常重要 - 计算不同的wd:Q5或计算它们并不明显 - 但后者因性能原因而更为可取。