объединение запросов SPARQL - PullRequest
0 голосов
/ 16 декабря 2018

Я хочу получить население наиболее и наименее населенного штата.Я знаю, как использовать ORDER BY (ASC и DESC).Как я могу объединить эти два (ASC и DESC) в одном запросе?

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

1 Ответ

0 голосов
/ 16 декабря 2018
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 можно использовать по имени подзапросы в таком случае:

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 не используется, то это принимается заединая неявная группа, к которой относятся все решения.

...