用于合并 RDF 数据立方体的 SPARQL 查询

SPARQL query for merging RDF Data Cubes

我正在参与一个存储 2 个 RDF 数据立方体的项目:

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

在我们进入 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.
                 }
    
    }