用于合并 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 个输出图,其中包含 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 本身之前,您的查询存在几个问题。
- 您的数据集包含湿度,但您查询的是温度。
- 您查询的年份不匹配,除了2017年:在
你正在看的第一张图是 2017 年和 2018 年,第二张图是你
正在看 2016 年和 2017 年。在某些情况下这可能没问题,但是
它不会产生您期望的结果。
现在是 SPARQL 问题。
- 您同时查询了
?cityid
和 ?city
,但是 ?city
的值在命名图形中拼写不同,即 "Hà Nội"@en
和 "Ha Noi"@en
。
- 您的观察结果与命名图表中的资源不同。
- 您只使用一个变量,
?g
用于命名图形。这意味着 2/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.
}
}
我正在参与一个存储 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 时删除空值,或者您是否有任何查询可以给出正确的预期结果?
在我们进入 SPARQL 本身之前,您的查询存在几个问题。
- 您的数据集包含湿度,但您查询的是温度。
- 您查询的年份不匹配,除了2017年:在 你正在看的第一张图是 2017 年和 2018 年,第二张图是你 正在看 2016 年和 2017 年。在某些情况下这可能没问题,但是 它不会产生您期望的结果。
现在是 SPARQL 问题。
- 您同时查询了
?cityid
和?city
,但是?city
的值在命名图形中拼写不同,即"Hà Nội"@en
和"Ha Noi"@en
。 - 您的观察结果与命名图表中的资源不同。
- 您只使用一个变量,
?g
用于命名图形。这意味着 2/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.
}
}