Выберите лучшие результаты X для каждой группы - PullRequest
0 голосов
/ 17 мая 2018

У меня есть несколько наблюдений куба данных RDF, у которых есть прикрепленный атрибут, в моем случае это дата, когда было записано это значение.

Например, шаблон прост (без учета других измерений / показателей)./ attribute):

<obs1> a qb:Observation ;
  my:lastupdate '2017-12-31'^^xsd:date ;
  qb:dataSet <dataSet1> .

<obs2> a qb:Observation ;
  my:lastupdate '2016-12-31'^^xsd:date ;
  qb:dataSet <dataSet1> .

<obs2_1> a qb:Observation ;
  my:lastupdate '2017-12-31'^^xsd:date ;
  qb:dataSet <dataSet2> .

<obs2_2> a qb:Observation ;
  my:lastupdate '2015-12-31'^^xsd:date ;
  qb:dataSet <dataSet2> .

Итак, у меня в магазине несколько qb:DataSet.Теперь я хотел бы выяснить последние значения X my:lastupdate для набора данных.Допустим, мне нужны последние 5 значений для каждого конкретного набора данных.

Я могу сделать это очень легко для одного конкретного набора данных:

SELECT * WHERE {

  ?observation my:lastupdate ?datenstand ;
                 qb:dataSet <dataSet1>                                                                                                                                            
} ORDER BY DESC(?datenstand) LIMIT 5    

Но я немного растерялся, если этовсе возможно в рамках одного запроса SPARQL для каждого набора данных.Я пробовал различные комбинации с суб-выбором, комбинациями LIMIT и GROUP BY, но ничто не привело к результату, который я ищу.

1 Ответ

0 голосов
/ 18 мая 2018

Этот шаблон запроса подробно обсуждался на ныне несуществующем сайте SemanticOverflow Q + A: 'получить 3 самых больших города для каждой страны' , и общее мнение заключалось в том, что запросы в форме ' получить верхние n связанных элементов для каждого главного элемента ' невозможно эффективно обработать одним запросом SPARQL.

Основная проблема заключается в том, что вложенные запросы оцениваются снизу вверх, и предложения GROUP / LIMIT будут применяться ко всему набору результатов, а не к каждой группе.

Единственное полезное исключение из правила снизу вверх - это (not) exists фильтры, которые видны на текущих привязках. Вы можете использовать этот факт для написания запросов, таких как:

select ?country ?city ?population where {

    ?country a :Country; :city ?city.
    ?city :population ?population.

    filter not exists { select * where {

        ?country :city ?_city.
        ?_city :population ?_population.

        filter ( ?_population > ?population )

    } offset 3 }

} order by ?country desc(?population)

К сожалению, этот подход обычно не подходит для больших наборов данных реального мира, так как он включает в себя сканирование и фильтрацию декартового произведения каждой группы стран / городов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...