首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并RDF数据立方体的SPARQL查询

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

Stack Overflow用户
提问于 2020-12-03 14:02:06
回答 1查看 134关注 0票数 1

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

temperature-dataset

  • Industry数据立方体:
  • 气候数据立方体:湿度数据集、降水数据集、工业数据立方体,两个数据立方体都以命名图形形式存储在GraphDB数据库中。这些图的每个数据集都具有相同的维度:时间和年份。现在,我需要将这些数据集合并在一起,以便进行数据挖掘。假设下面的观测数据包含2016-2017年哈诺伊市的气候和工业数据:

图:http://sda-research.ml/graph/climate

代码语言:javascript
复制
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

代码语言:javascript
复制
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 .

现在,我想合并两张包含2016-2017年河内湿度和工业价值的输出图。在GraphDB SPARQL端点上,我使用了以下查询:

代码语言:javascript
复制
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.
             }
      }
}

预期产出:

代码语言:javascript
复制
city------year------humidity------industry---
Ha Noi-----2016-------8.17E1------ 1.073E2---
Ha Noi-----2017-------8.18E1-------1.07E2----

实际产出:

代码语言:javascript
复制
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值,或者是否有任何提供正确预期结果的查询?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-03 14:52:24

在进入SPARQL之前,您的查询有几个问题。

temperature.

  • The

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

现在在斯巴克尔问题上。

"Ha Noi"@en.

  • Your
  1. 查询?cityid?city,但在命名图中?city值的拼写不同,也就是说,在命名图中"Hà Nội"@en?city观测值不是相同的资源。
  2. 只使用一个变量?g来表示命名图。这意味着2/4的结果是通过查看气候图得到的,而第二个结果则是通过工业图得到的。当您想到要从中提取源的特定图形时,应该指定它。
  3. 当您想到一个特定的城市时,我会避免使用REGEX。不同的triplestores实现查询规划的方式不同,但这是一项昂贵的操作,可能会大大降低性能。有关如何使用values关键字.

处理此问题,请参见下面的内容。

下面是一个稍加修改的查询,它产生了您想要的结果:

代码语言:javascript
复制
    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.
                 }
    
    } 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65127491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档