You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:23:05