如何使用SPARQL结合Data Cube Vocabulary从CSV构建RDF?
用Tarql构建World Bank数据的Data Cube RDF示例
我明白你现在的困扰——已经用Tarql生成了基础RDF,但想要把World Bank世界发展指标转换成符合Data Cube Vocabulary的结构化RDF,却找不到现成的实操示例。下面我就结合这个数据集的典型结构,给你一套可复用的Tarql代码,再拆解每个部分的作用,帮你快速上手。
先理清Data Cube的核心对应关系
World Bank的每一行数据对应Data Cube里的一个观测值(Observation),我们需要先定义好Data Cube的核心骨架:
- 数据集(DataSet):整个World Bank发展指标集合
- 数据结构定义(DSD):定义观测值包含的维度、度量、属性
- 维度(Dimension):比如国家、年份、指标类型
- 度量(Measure):指标的数值
- 属性(Attribute):比如指标名称、单位、发布信息
Tarql完整代码示例
假设你的CSV包含这些核心列:Country Name, Country Code, Year, Indicator Name, Indicator Code, Value, Unit,以下是对应的Tarql脚本:
PREFIX qb: <http://purl.org/linked-data/cube#> PREFIX data1: <http://data1/#> PREFIX dbo: <http://dbpedia.org/ontology/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX wb: <http://worldbank.data/#> # 1. 定义数据结构定义(DSD) CONSTRUCT { wb:wb-indicators-dsd a qb:DataStructureDefinition ; qb:component [ qb:dimension wb:country ; qb:order 1 ] ; qb:component [ qb:dimension wb:year ; qb:order 2 ] ; qb:component [ qb:dimension wb:indicator ; qb:order 3 ] ; qb:component [ qb:measure wb:indicatorValue ; qb:order 4 ] ; qb:component [ qb:attribute wb:indicatorName ; qb:order 5 ] ; qb:component [ qb:attribute wb:unit ; qb:order 6 ] . # 2. 定义维度、度量、属性的类型 wb:country a qb:DimensionProperty ; rdfs:label "Country"@en ; rdfs:range dbo:Country . wb:year a qb:DimensionProperty ; rdfs:label "Year"@en ; rdfs:range xsd:gYear . wb:indicator a qb:DimensionProperty ; rdfs:label "Indicator Code"@en ; rdfs:range skos:Concept . wb:indicatorValue a qb:MeasureProperty ; rdfs:label "Indicator Value"@en ; rdfs:range xsd:decimal . wb:indicatorName a qb:AttributeProperty ; rdfs:label "Indicator Name"@en . wb:unit a qb:AttributeProperty ; rdfs:label "Unit"@en . # 3. 定义数据集 wb:world-development-indicators a qb:DataSet ; rdfs:label "World Bank World Development Indicators"@en ; qb:structure wb:wb-indicators-dsd . # 4. 生成每个观测值(对应CSV的每一行) ?observationUri a qb:Observation ; qb:dataSet wb:world-development-indicators ; wb:country ?countryUri ; wb:year ?yearValue ; wb:indicator ?indicatorUri ; wb:indicatorValue ?numericValue ; wb:indicatorName ?indicatorName ; wb:unit ?unit . } FROM <file:world-development-indicators.csv> WHERE { # 跳过CSV表头 OFFSET 1 # 生成观测值的唯一URI BIND (URI(CONCAT('http://worldbank.data/observation/', ?`Country Code`, '-', ?Year, '-', ?`Indicator Code`)) AS ?observationUri) # 映射国家代码到DBpedia的国家URI(比如USA -> http://dbpedia.org/resource/United_States) BIND (URI(CONCAT('http://dbpedia.org/resource/', REPLACE(?`Country Name`, ' ', '_'))) AS ?countryUri) # 转换年份为xsd:gYear类型 BIND (xsd:gYear(?Year) AS ?yearValue) # 生成指标的URI BIND (URI(CONCAT('http://worldbank.data/indicator/', ?`Indicator Code`)) AS ?indicatorUri) # 转换数值为decimal类型(处理空值情况) BIND (IF(?Value != "", xsd:decimal(?Value), NULL) AS ?numericValue) # 保留指标名称和单位的字符串类型 BIND (STRLANG(?`Indicator Name`, "en") AS ?indicatorName) BIND (STRLANG(?Unit, "en") AS ?unit) }
代码关键部分解释
- DSD定义:这是Data Cube的核心骨架,明确告诉RDF消费者这个数据集的结构包含哪些维度、度量和属性,每个组件的顺序也可以通过
qb:order指定。 - 维度/度量/属性声明:给每个字段定义类型和标签,让RDF更具语义化,比如
wb:country的范围是DBpedia的国家类,方便和其他数据集关联。 - 观测值生成:每一行CSV对应一个
qb:Observation,通过qb:dataSet关联到数据集,每个维度、度量、属性都对应到定义好的属性上。 - 数据类型转换:把CSV里的字符串年份转成
xsd:gYear,数值转成xsd:decimal,确保语义正确;同时处理可能的空值情况。
额外提示
- 如果你的CSV列名和示例不同,只需要调整
?后面的列名(注意列名有空格的话要加反引号)。 - 可以扩展属性部分,比如加上数据发布日期、数据源等信息,让RDF更完整。
- 生成后可以用RDF浏览器(比如Apache Jena Fuseki)查看结构,验证是否符合Data Cube规范。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

