1

我正在从事一个存储 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 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.
             }
      }
}

预期输出:

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 时如何删除空值,或者您是否有任何查询可以提供正确的预期结果?

4

1 回答 1

3

在我们进入 SPARQL 本身之前,您的查询存在几个问题。

  1. 您的数据集包含湿度,但您正在查询温度。
  2. 您查询的年份不匹配,但 2017 年除外:在第一张图中,您查看的是 2017 年和 2018 年,在第二张图中,您查看的是 2016 年和 2017 年。这在某些情况下可能很好,但不会产生你期望的结果。

现在就 SPARQL 问题而言。

  1. 您同时查询?cityidand ?city,但?city在命名图之间拼写不同的值,即"Hà Nội"@enand "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.
                 }
    
    } 
于 2020-12-03T14:52:24.377 回答