我是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”引起的吗?我该如何解决?
答案 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;在第一个候选解决方案中发生的问题。