簡體   English   中英

用於合並 RDF 數據立方體的 SPARQL 查詢

[英]SPARQL query for merging RDF Data Cubes

我正在從事一個存儲 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 個 output 圖表,其中包含 2016-2017 年河內的濕度和行業價值。 在 GraphDB SPARQL Endpoint 上,我使用了以下查詢:

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.
             }
      }
}

預期 output:

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

實際 output:

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 時刪除 null 值,或者您是否有任何查詢可以提供正確的預期結果?

在我們進入 SPARQL 本身之前,您的查詢存在幾個問題。

  1. 您的數據集包含濕度,但您正在查詢溫度。
  2. 您查詢的年份不匹配,但 2017 年除外:在第一張圖中,您查看的是 2017 年和 2018 年,在第二張圖中,您查看的是 2016 年和 2017 年。在某些情況下這可能很好,但不會產生你期望的結果。

現在就 SPARQL 問題而言。

  1. 您同時查詢?cityid?city ,但?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.
                 }
    
    } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM