Запрос SPARQL для объединения кубов данных RDF

Я участвую в проекте, в котором хранятся 2 куба данных RDF:

  • Куб климатических данных: набор данных о влажности, набор данных об осадках, набор данных о температуре
  • Куб отраслевых данных: набор отраслевых данных Оба куба данных хранятся в базе данных GraphDB как именованные графы. Каждый набор данных этих графиков имеет одно и то же измерение: время и год. Теперь мне нужно объединить эти наборы данных вместе для исследования данных. Допустим, мы приводим нижеприведенные наблюдения, которые содержат данные о климате и промышленности города Ханой за 2016-2017 годы:

график: http://sda-research.ml/graph/climate

Dataset-climate

ds:obs5 a qb:Observation;
  qb:dataSet ds:dataset-climate;
  prop:city "Ha Noi"@en;
  prop:cityid "hanoi";
  prop:humidity 8.17E1;
  prop:rainfall 2.1668E3;
  prop:year "2016"^^xsd:int .


ds:obs6 a qb:Observation;
  qb:dataSet ds:dataset-climate;
  prop:city "Ha Noi"@en;
  prop:cityid "hanoi";
  prop:humidity 8.18E1;
  prop:rainfall 2.6402E3;
  prop:year "2017"^^xsd:int .

график: http://sda-research.ml/graph/industry

Dataset-industry

ds:obs205 a qb:Observation;
  qb:dataSet ds:dataset-industry;
  prop:city "Hà Nội"@en;
  prop:cityid "hanoi";
  prop:industry 1.073E2;
  prop:year "2016"^^xsd:int .

ds:obs206 a qb:Observation;
  qb:dataSet ds:dataset-industry;
  prop:city "Hà Nội"@en;
  prop:cityid "hanoi";
  prop:industry 1.07E2;
  prop:year "2017"^^xsd:int .

Теперь я хочу объединить 2 графика для выходных данных, которые содержат влажность и промышленную ценность Ханоя в 2016-2017 годах. В конечной точке GraphDB SPARQL я использовал этот запрос:

PREFIX qb: <http://purl.org/linked-data/cube#>
PREFIX prop: <http://www.sda-research.ml/dc/prop/>
select ?city ?year ?temperature ?industry
where{
     {graph ?g {
            ?obs a qb:Observation. 
            ?obs prop:cityid ?cityid filter regex(?cityid, 'hanoi').
            ?obs prop:city ?city. 
            ?obs prop:year ?year filter(?year >= 2017 && ?year <= 2018 ).
            ?obs prop:temperature ?temperature.
            }
      }
  UNION 
     {graph ?g {
             ?obs a qb:Observation. 
             ?obs prop:cityid ?cityid filter regex(?cityid, 'hanoi').
             ?obs prop:city ?city.
             ?obs prop:year ?year filter(?year >= 2016 && ?year <= 2017).
             ?obs prop:industry ?industry.
             }
      }
}

Ожидаемый результат:

city------year------humidity------industry---
Ha Noi-----2016-------8.17E1------ 1.073E2---
Ha Noi-----2017-------8.18E1-------1.07E2----

Фактический выход:

city------year------humidity------industry--
Ha Noi-----2016-------8.17E1--------null----
Ha Noi-----2017-------8.18E1--------null----
Ha Noi-----2016--------null--------1.073E2--
Ha Noi-----2017--------null--------1.07E2---

Как я могу удалить нулевое значение при использовании UNION, или у вас есть запрос, который дает правильно ожидаемый результат?


person Rio Vo    schedule 03.12.2020    source источник


Ответы (1)


Прежде чем мы перейдем к самому SPARQL, с вашим запросом возникнет несколько проблем.

  1. Ваш набор данных содержит влажность, но вы запрашиваете температуру.
  2. Годы, которые вы запрашиваете, не совпадают, за исключением 2017: на первом графике вы смотрите на 2017 и 2018 годы, на втором вы смотрите на 2016 и 2017 годы. В некоторых случаях это может быть нормально, но не дадут ожидаемый результат.

Теперь о проблемах SPARQL.

  1. Вы запрашиваете и ?cityid, и ?city, но значение ?city пишется по-разному в именованных графах, а именно "Hà Nội"@en и "Ha Noi"@en.
  2. Ваши наблюдения - это не один и тот же ресурс в именованных графах.
  3. Вы используете только одну переменную ?g для именованных графиков. Это означает, что 2/4 результатов получены при просмотре климатического графика, а два вторых результата - при просмотре отраслевого графика. Если у вас есть конкретный график для извлечения источников, вы должны указать его.
  4. Когда вы имеете в виду конкретный город, я бы не стал использовать REGEX. Разные хранилища троек по-разному реализуют планирование запросов, но это дорогостоящая операция, которая может значительно ухудшить вашу производительность. См. Ниже, как с этим справиться с помощью ключевого слова values.

Теперь вот слегка измененный запрос, который дает те результаты, которые вам нужны:

    PREFIX qb: <http://purl.org/linked-data/cube#>
    PREFIX prop: <http://www.sda-research.ml/dc/prop/>
    
    select ?cityid ?year ?humidity ?industry
    where{
     values ?cityid {'hanoi'}
    graph <http://sda-research.ml/graph/climate> {
          ?obs1 a qb:Observation.
          ?obs1 prop:cityid ?cityid.
          ?obs1 prop:year ?year filter(?year >= 2016 && ?year <= 2017 ).
          ?obs1 prop:humidity ?humidity.
                }
    
    graph <http://sda-research.ml/graph/industry> {
          ?obs2 a qb:Observation.
          ?obs2 prop:cityid ?cityid.
          ?obs2 prop:year ?year filter(?year >= 2016 && ?year <= 2017).
          ?obs2 prop:industry ?industry.
                 }
    
    } 
person Valerio Cocchi    schedule 03.12.2020
comment
Работает как часы! Спасибо за вашу активную поддержку: D Я новичок в технологии связанных данных, поэтому ваш комментарий очень ценен для меня. - person Rio Vo; 04.12.2020