如何通过限定词显示或过滤?

时间:2018-08-03 13:23:44

标签: sparql wikidata

参见例如P297 at Q37024,有一个限定符(P582)。

显示/调试

此查询是错误的,如何显示Q37024案件的结束时间?

SELECT ?item ?iso2_code ?endtime 
WHERE {
  ?item wdt:P297 ?iso2_code
  OPTIONAL { ?iso2_code pq:P582 ?endtime }
}

过滤器

我需要所有没有结束时间的物品。


关于真实案例的注释

我正在查询

SELECT DISTINCT ?iso2_code  ?wd_id
WHERE {
  ?item wdt:P297 ?iso2_code
  BIND(strafter(STR(?item),"http://www.wikidata.org/entity/") as ?wd_id).
} ORDER BY ?iso2_code

但检索重复项,

  • AI | {Q25228,Q1450765} | Q1450765不使用P582,Q25228不使用
  • CS | {Q33946,Q37024} ...
  • DK | {Q35,Q756617}
  • GE | {Q230,Q1050859}
  • NL | {Q55,Q29999}
  • PS | {Q219060,Q407199}
  • YU | {Q83286,Q838261}

所以我需要排除一个,但是正确的一个:到结束时间。


PS:有一本关于WIKIDATA Qualifiers的手册,但没有检索数据集的真实案例。

1 个答案:

答案 0 :(得分:1)

SELECT DISTINCT (?simple_value AS ?iso2_code) ?wd_id
WHERE {
  ?item p:P297 ?statement .
  ?statement ps:P297 ?simple_value .
  # ?statement a wikibase:BestRank
  OPTIONAL { ?statement pq:P582 ?qualifier . }
  FILTER ( !bound(?qualifier) )
  BIND ( strafter(str(?item), str(wd:)) AS ?wd_id ).
} ORDER BY ?iso2_code 

Try it!

您可以使用FILTER NOT EXISTS { ?statement pq:P582 ?qualifier . }代替
OPTIONAL { ?statement pq:P582 ?qualifier . } FILTER ( !bound(?qualifier) )

Wikidata数据模型记录在here中。 this page上有许多查询示例,例如G。 this one