【问题标题】:combining SPARQL queries组合 SPARQL 查询
【发布时间】:2018-12-16 09:43:46
【问题描述】:

我想获取人口最多和人口最少的州的人口。我知道如何使用ORDER BYASCDESC)。如何将这两个(ASCDESC)组合在一个查询中?

SELECT  ?population
{
?state rdf:type :State
?state :hasPopulation ?population.
} ORDER BY DESC(?population) LIMIT 1
AND

SELECT  ?population
{
?state rdf:type :State
?state :hasPopulation ?population.
} ORDER BY ASC(?population) LIMIT 1

【问题讨论】:

    标签: sparql


    【解决方案1】:
    SELECT ?population_max ?population_min {
        ?state_max rdf:type :State .
        ?state_max :hasPopulation ?population_max .
        ?state_min rdf:type :State .
        ?state_min :hasPopulation ?population_min .
    } ORDER BY DESC(?population_max) ASC(?population_min) LIMIT 1
    

    也许效率更高:

    SELECT * {
        {
            SELECT (?population AS ?population_max) {
                ?state rdf:type :State .
                ?state :hasPopulation ?population .
            } ORDER BY DESC(?population) LIMIT 1 
        }
        {
            SELECT (?population AS ?population_min) {
                ?state rdf:type :State .
                ?state :hasPopulation ?population .
            } ORDER BY ASC(?population) LIMIT 1
        }
    }
    

    对于 AnzoGraph 或 Blazegraph,在这种情况下可以使用 named subqueries

    SELECT *
    WITH {
        SELECT ?pop { [] a :State ; :hasPopulation ?pop }
    } AS %unsorted
    WHERE {
        { SELECT (?pop AS ?max) { INCLUDE %unsorted } ORDER BY DESC(?pop) LIMIT 1 }
        { SELECT (?pop AS ?min) { INCLUDE %unsorted } ORDER BY  ASC(?pop) LIMIT 1 }
    }
    

    最后,与其重写不如合并:

    SELECT (MAX(?population) AS ?population_max) (MIN(?population) AS ?population_min) {
        ?state rdf:type :State .
        ?state :hasPopulation ?population
    } 
    

    如果使用聚合...但未使用 GROUP BY 术语,则这将被视为单个隐式组,所有解决方案都属于该组。

    【讨论】:

    • 谢谢,第二个将解决我的问题而不会创建很多变量。
    【解决方案2】:

    您也许可以使用 UNION 来组合“最大”和“最小”人口。这是 AnzoGraph 语法:

        WITH (
          SELECT ?pop 
          WHERE { 
              ?state a :State ; 
                     :hasPopulation ?pop
          }
          as <unsorted_pop>
       )
       SELECT *
        WHERE {
            { SELECT (max(?pop) as ?population)
              WHERE { QUERY <unsorted_pop> }
            }
            UNION
            { SELECT (min(?pop) as ?population)
              WHERE { QUERY <unsorted_pop> }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多