用乌龟进行SPARQL查询

时间:2015-10-28 18:54:06

标签: sparql

我是SPARQL的新手。查询链接数据是一个有趣的概念。我已经按照教程来理解它。现在,我使用欧洲委员会的数据作为实验模型。 (http://linkedpolitics.ops.few.vu.nl/home

现在,我想搜索每个国家/地区的座位数量。下面的查询给出了我想要的内容。

PREFIX lpv: <http://purl.org/linkedpolitics/vocabulary/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

# count seats per country
SELECT ?country (COUNT(DISTINCT ?members) AS ?c)
WHERE {
   ?members lpv:countryOfRepresentation ?cOR .
   ?cOR rdfs:label ?country .
} GROUP BY ?cOR

嗯,我认为它应该有效,但我得到的是下一个

  ?country        ?c
1           "70"^^xsd:integer
2           "126"^^xsd:integer
3           "49"^^xsd:integer
4           "20"^^xsd:integer

国家/地区列显示为空白。现在当我调整查询

SELECT ?cOR (COUNT(DISTINCT ?members) AS ?c)

我得到了

         ?cOR              ?c
1   lp:EUCountry_AT     "70"^^xsd:integer
2   lp:EUCountry_BE     "126"^^xsd:integer
3   lp:EUCountry_BG     "49"^^xsd:integer
4   lp:EUCountry_CY     "20"^^xsd:integer

这些结果是URI(就像第一个导致http://linkedpolitics.ops.few.vu.nl/browse/list_resource?r=http%3A//purl.org/linkedpolitics/EUCountry_AT

当你点击它时,你可以清楚地看到指向“奥地利”的rdfs:label。但这不会出现在第一个查询结果中。

我的问题是,为什么?cOR rdfs:label ?country会给出空白结果? 那是因为“sameAs”引起的吗?我该如何解决?

1 个答案:

答案 0 :(得分:3)

正如所写,您的查询不合法SPARQL。如果该变量不是您要归类的变量之一,则在进行分组时,您无法在SELECT部分​​中放置变量。您可以在sparql.org's query validator查看您的查询,它会告诉您:

  

SELECT中的非组键变量:?country

您可以通过以下方式在您的论坛中添加?国家/地区:

SELECT ?country (COUNT(DISTINCT ?members) AS ?c)
WHERE { ... }
GROUP BY ?cOR ?country

后者的问题是标签可能有不同的值。例如,您可以&#34; countryName&#34; @en(语言标记字符串)和&#34; countryName&#34; (一个简单的字符串)。

    country         c
1   Austria         "70"^^xsd:integer
2   "Austria"@en    "70"^^xsd:integer
3   Belgium         "126"^^xsd:integer
4   "Belgium"@en    "126"^^xsd:integer
...

或许更好的选择是示例?country:

的值
SELECT (sample(?country) as ?country_) (COUNT(DISTINCT ?members) AS ?c)
WHERE { ... }
GROUP BY ?cOR
    country_        c
1   "Austria"@en    "70"^^xsd:integer
2   "Belgium"@en    "126"^^xsd:integer
3   "Bulgaria"@en   "49"^^xsd:integer

另一种方法是将国家/地区标签过滤为给定语言。例如,

SELECT ?country (COUNT(DISTINCT ?members) AS ?c)
WHERE { ...
  filter langMatches(lang(?country),"en")
}
GROUP BY ?cOR ?country

这似乎适用于您的查询,但如果某个国家/地区拥有多个英文标签,您仍然可以获得&#34;重复的结果&#34;在第一个候选解决方案中发生的问题。