【问题标题】:SPARQL query with turtle使用海龟的 SPARQL 查询
【发布时间】:2015-10-28 18:54:06
【问题描述】:

我是 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 指向“Austria”。但这不会出现在第一个查询结果中。

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

【问题讨论】:

    标签: sparql


    【解决方案1】:

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

    SELECT 中的非组键变量:?country

    您可以通过以下方式将 ?country 包含在您的组中:

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

    后者的问题是标签可能有不同的值。例如,您可以使用“countryName”@en(语言标记字符串)和“countryName”(纯字符串)。

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

    也许更好的选择是sample ?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
    

    这似乎适用于您的查询,但如果一个国家/地区有多个英文标签,您仍然会遇到第一个候选解决方案中发生的“重复结果”问题。

    【讨论】:

    • 感谢您的回复。它向我展示了一些关于我的查询的见解。阅读您的答案后,我只是将 GROUP BY 子句中的 ?cOR 替换为 ?country 现在,国家列显示标签。我必须小心这种查询语言,因为它处理数据的方式与 SQL 系列不同。不过,sample(...) 做了什么? The specs 不清楚。
    • 实际上,这也正是 sql 处理这一问题的方式。当您按某个变量分组时,您最终会为每组的每个其他变量获得一组值。从该集合中采样样本,然后只返回其中一个。
    • 例如,如果在未分组的查询中有四个 [name, age] 结果行,(John, 25), (Mary, 25), (Tom, 56), (Tim, 56)并按年龄分组,你会得到 ({John, mary}, 26) ({tom, tim}, 56),就像 sql。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多