【问题标题】:SPARQL query for merging RDF Data Cubes用于合并 RDF 数据立方体的 SPARQL 查询
【发布时间】:2020-12-03 14:02:06
【问题描述】:

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

【问题讨论】:

    标签: merge sparql union graphdb named-graphs


    【解决方案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.
                     }
        
        } 
    

    【讨论】:

    • 它就像一个魅力!感谢您的热情支持:D 我只是关联数据技术的新手,因此您的评论对我来说非常有价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多