4. DCAT:数据目录词汇表归纳总结
数据目录,说白了就是管理数据的数据。你有一堆数据集,哪个是哪个?谁创建的?什么格式?怎么下载?DCAT 就是给这个问题定的一套标准词汇表。它是 W3C 推荐的,专门用来描述数据目录里的数据集、数据服务和数据分发。
我最早接触 DCAT 是帮一个政府部门做开放数据平台。当时他们 Excel 里记了 200 多个数据集,连字段含义都不统一。后来用 DCAT 一建模,所有目录立刻能互操作。嗯,今天我们就把它拆开看。
4.1 核心类,就这几个
DCAT 的类不多,但每个都很关键。我整理了下面的表格,方便你对照。
| 类 | 前缀 | 描述 | 我常用来表示 |
|---|---|---|---|
| Catalog | dcat:Catalog | 数据目录本身,是一组数据集的集合 | 一个开放数据门户、一个内部数据资产清单 |
| Dataset | dcat:Dataset | 一个数据集,可以是表、文件集合、API 的产出 | 某个 CSV 文件、某个数据库表 |
| Distribution | dcat:Distribution | 数据集的具体表现形式(文件、API 端点等) | 一份 JSON 文件、一个可下载的 ZIP |
| DataService | dcat:DataService | 提供数据访问的服务(API、SPARQL 端点等) | 一个 REST API、一个 OGC WMS |
| Agent | foaf:Agent | 参与者(人、组织)——DCAT 复用了 FOAF | 数据提供方、数据发布者 |
我的习惯:实际建模时,我会把 Catalog 看作项目根节点,Dataset 是项目里的每个数据产品,Distribution 是产品的不同包装方式。DataService 单独拿出来,因为它不是数据本身,而是获取数据的管道。
4.2 关键属性,一个都不能少
每个类都有推荐属性。下面列出最常用的,记住这些基本就能应付 80% 的场景。
dcat:Catalog
dct:title— 目录名称dct:description— 目录描述dct:publisher— 发布者(指向 foaf:Agent)dcat:dataset— 包含的数据集列表(指向 dcat:Dataset)
dcat:Dataset
dct:title/dct:descriptiondct:issued— 发布日期dct:modified— 最后修改日期dcat:distribution— 指向分发实例dct:theme— 主题分类(比如医学、交通)
dcat:Distribution
dcat:downloadURL— 直接下载链接dcat:accessURL— 访问链接(可能是一个预览页)dct:mediaType— 媒体类型(如text/csv)dcat:byteSize— 文件大小(字节)
重点提醒:dcat:downloadURL 和 dcat:accessURL 的区别很容易搞混。downloadURL 是直接能拿到数据的链接,accessURL 是提供访问的入口(可能还需要参数)。我见过有人把 GitHub 仓库主页当成 downloadURL,结果别人拿不到数据。
4.3 实战:一段 Turtle 描述
光看理论没意思,我们来写一段真实的 DCAT 描述。假设有一个空气质量数据集。
@prefix dcat: <http://www.w3.org/ns/dcat#> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<http://data.example.org/catalog/airquality> a dcat:Catalog ;
dct:title "北京市空气质量数据目录"@zh ;
dct:publisher <http://data.example.org/org/bj-env> ;
dcat:dataset <http://data.example.org/dataset/pm25> , <http://data.example.org/dataset/pm10> .
<http://data.example.org/dataset/pm25> a dcat:Dataset ;
dct:title "PM2.5 小时浓度数据"@zh ;
dct:description "2024年北京市各监测站 PM2.5 小时浓度"@zh ;
dct:issued "2024-01-01"^^xsd:date ;
dct:modified "2024-12-31"^^xsd:date ;
dcat:distribution <http://data.example.org/dist/pm25-csv> .
<http://data.example.org/dist/pm25-csv> a dcat:Distribution ;
dcat:downloadURL <http://data.example.org/files/pm25-2024.csv> ;
dct:mediaType "text/csv" ;
dcat:byteSize "12583320"^^xsd:decimal ;
dct:format "CSV" .
<http://data.example.org/org/bj-env> a foaf:Organization ;
foaf:name "北京市生态环境局"@zh .
这段代码你拿去可以直接跑在 Apache Jena 或者任何 RDF 解析器里。我刚开始用 DCAT 时,总喜欢把 Distribution 写得特别复杂,后来发现只要 downloadURL 和 mediaType 填对,大部分工具都能自动处理。
4.4 避坑指南
我曾经踩过的坑,你大概率也会遇到
- Dataset vs Distribution 分不清:Dataset 是逻辑概念,Distribution 是物理实现。同一个数据集可以有 CSV、JSON、XML 三个 Distribution。你想想看,如果把格式信息直接写在 Dataset 上,那多个格式怎么办?
- 忘掉
dct:publisher:数据来源是谁?很多目录只写数据集标题,没写发布者。一旦数据有问题,没人追责。别忘了关联一个foaf:Agent。 - 时间格式不统一:DCAT 推荐用
xsd:date或xsd:dateTime。我见过有人用"2024/01/01",RDF 解析直接报错。直接用"2024-01-01"^^xsd:date最保险。 - 过度使用
dcat:keyword:关键词是自由文本,没法做精确查询。如果要做分类,老实遵守dct:theme引一个受控词表。
4.5 什么时候该用 DCAT?
说句实在话,不是所有元数据场景都需要 DCAT。我的判断标准就一条:
- 需要跨组织交换数据目录?用 DCAT。它是 W3C 标准,兼容性最好。
- 只是内部数据库文档?可以考虑更简单的 Dublin Core 或自己建模型。
- 需要描述数据服务接口?DCAT 的 DataService 类加上 OpenAPI 描述就够了。
- 想做数据资产目录?DCAT + 企业扩展(比如
dcat:Catalog dcat:Resource可以自定义属性)基本够用。
一个小技巧:先用 DCAT 的核心模型建一个原型,花不了半天。给业务方看 demo,确认后再扩展。我就这么干过,避免了后期推翻重来。
DCAT 其实不复杂,核心就是 Catalog → Dataset → Distribution 三层结构。把它理解成“书架 → 书 → 书的封面/格式”,就很好记。记住那几个属性,写几条 Turtle,你就能上手了。