命名空间

命名空间定两件事:条目在哪儿(内容标识符),以及它是什么(类型与字段)。做这件事的理由很直接——机器引用一个条目,需要一个不会变的地址;地址一变,引用就断。

一、两个前缀

前缀 展开为 用途
cz: https://chaoshanwiki.cn/ 内容条目标识符
czns: https://chaoshanwiki.cn/ns/# 本站自定义的类型与属性

分成两个前缀,是因为这两件事本来不同:cz:回答「这个东西在哪」,czns:回答「这一类东西是什么意思」。早先把两者混在一个前缀下,cz:IntangibleHeritage 按规则会展开到站点根目录,而不是页面内的锚点——那是个错误,现已改开。

标识符带尾斜杠。写法是 cz:chaozhou-opera/,末尾的斜杠属于标识符,不是装饰。原因是 JSON-LD 的前缀展开只是把前缀与后缀直接相接,不会替补斜杠;少一个斜杠,展开得到 https://chaoshanwiki.cn/chaozhou-opera,与页面规范地址 https://chaoshanwiki.cn/chaozhou-opera/ 差一个字符,严格说就不是同一个资源。规则里展开结果与规范地址逐字相同,所以斜杠要写进标识符。

首页是唯一的例外:写作 cz:(后缀为空),展开即 https://chaoshanwiki.cn/,正好是站点根地址。带语言分支的条目照路径写,如 cz:en/travel-chaozhou/,展开即对应英文页。

标识符直接取自 URL 路径,不另造编号,是为了好读、好查、好排错——看到 cz:chaozhou-opera/ 就知道该去哪个页面核对。

二、两层类型

这里分两层,不能混为一列:页面本身是什么,与页面描述的对象是什么。同一个页面既可以是 Article,其描述对象又可以是某类非遗项目。早先把 Article 与 Person、Place 放在同一张表里,是把两层压成了一层,现已分开。

第一层,页面类型(pageType):

类型 中文 适用范围
Article 词条页 有独立主题的叙述性条目,占全站多数
CollectionPage 索引页 按主题汇总若干条目的页面,如非遗名录、地域索引
WebPage 说明页 关于、参与、许可一类,以及各语言分支页
Dataset 数据集 /dataset/ 与 /fact-sheet/
FAQPage 问答页 /faq/,问答对另用 FAQPage 标注
DefinedTermSet 词表页 /ns/ 与 /vocab/

第二层,主体类型(subjectType):

类型 中文 词表 适用范围
Person 人物 schema.org 以生平为主体的历史人物
Place 地理与政区 schema.org 府域、县份、聚落、港口、祠庙所在
TouristAttraction 景点 schema.org 文物保护单位、古建、遗址、山川
Event 节俗与礼仪 schema.org 按时间发生的岁时节俗与人生礼仪
czns:IntangibleHeritage 非遗项目 本站 对应国家级非遗名录中的项目,页内标编号与批次
czns:Guide 行程编排 本站 按城市与天数编排的路线页
czns:FoodItem 饮食品类 本站 菜、粿、茶这一类文化品类,不是经营场所
czns:Fact 事实条目 本站 见 /fact-sheet/,一条一个断言,带出处与核查日期
DefinedTermSet 词表与对照表 schema.org 术语表、czns 词表、命名空间与方言词对照这类「一组被定义的词」
Thing 未归类 schema.org 上述都不贴切的,如实记 Thing,不硬套

对应不上的记 Thing。类型是告诉机器这个资源究竟是什么,不是让条目显得专业;套不进去就不套。

三、自定义词表 czns

四个类都在此定义,不指向外部词表。每一个都有不能直接套用 schema.org 的理由:

术语 中文 为什么自设
czns:IntangibleHeritage 非遗项目 schema.org 没有对应类。用 Article 加自由文本,标不出批次、编号与申报地区这几个关键字段。
czns:Guide 行程编排 schema.org 的 TouristTrip 要求逐条列出 itinerary 行程项,本站是按城市编排的叙事型路线页,结构不合。
czns:FoodItem 饮食品类 菜、粿、茶是文化品类,不是经营场所。schema.org 的 FoodEstablishment 指餐厅、饮食店这类实体,不能拿来标一道菜。
czns:Fact 事实条目 单条断言要能独立引用,需要一个可指的记录类型,schema.org 无同类。

另有七个自定义属性,用在数据集与事实清单里:

属性 含义
czns:pageType 页面本身是什么
czns:subjectType 页面主要描述的对象是什么
czns:cluster 跨语言对应关系,同簇各页共用母本 slug
czns:charCount 正文用字数:去标签、去空白后计数,不含 <script>、<style> 内的嵌入数据(如事实清单的 JSON)
czns:hasSourceSection 是否有「来源」节
czns:claim 一条事实断言
czns:verifiedOn 该条事实最后核对通过的日期

其中两处是刻意与 schema.org 分开的:czns:verifiedOn 记事实最后核对通过的日期,schema:dateModified 记页面最后修改日期。这两件事经常不同——一条事实可能十月一日核过,十月十日只是补了个链接;把两者塞进同一个属性,机器就分不出「内容变了」和「只是格式动了」。czns:claim 同理,schema:text 表示某个作品的正文,不是通用的事实断言字段。

四、稳定性承诺

三条,写在这里就是承诺:

  • 标识符一经发布,不再变更,也不回收。条目合并,被合并的那个 czid 不再分配给别的条目。
  • 正常情况下,标识符与规范地址逐字相同,即 cz:<路径>/ 展开等于页面 URL。
  • 页面迁移是这条规则的唯一例外。确需改地址时,旧地址保留 301 到新地址,数据集里记的是迁移后的规范地址;旧标识符不再出现在数据集中,改址经过记入站内档案。

另有一件与稳定相关的事:同一内容的多语言版本,各自有独立标识符,靠数据集里的 cluster 字段标出同簇关系——五语同簇共用母本 slug。不这么做,同一个文化对象的五个语言版本会被机器当成五个互不相干的实体。

第四件事谈不上承诺,只是现状:平台是 WordPress.com,不能做内容协商(Accept 头分流),所以 cz:chaozhou-opera/ 解析到的是人读的 HTML 页,不是 RDF 文档。机器要取结构化数据,走 数据集 与 事实清单 的 JSON。这一点如实写在前面,免得到时候对不上。

五、类型与条目的对应

全部 272 个条目(其中 99 页是其他语言的版本,归为 175 组)的类型、板块、字数、配图数、是否设「来源」节,都列在数据集里。此处只给分布:

板块 条目数
行程 100
景点 39
其他 39
非遗 13
民俗·礼俗 12
语言分支 12
民俗·岁时 10
关于与参与 9
历史与地理 7
人物 6
机器可读 6
饮食 6
文献与索引 5
方言 3
民俗·信仰 3
专题 2
页面类型 条目数
Article 205
CollectionPage 43
WebPage 20
Dataset 2
FAQPage 1
DefinedTermSet 1

六、怎么用

先说每个词指什么、为什么这样定;可直接被解析器读取的正式定义另在词表 czns,给出 rdfs:label、rdfs:comment、rdfs:range、rdfs:subClassOf,附 Turtle 全文与 JSON-LD 两种格式。

把下面这段放进任何一份数据的 @context,字段名即可按这套规则展开:

{
  "@context": { … 下节的映射对象,整段复制 … },
  "czid": "cz:chaozhou-opera/",
  "cztype": "schema:Article",
  "title": "潮剧",
  "subjectType": "czns:IntangibleHeritage"
}

页内数据里,cztype 的值写成 schema:Article 这种带前缀的形式,不写裸名 Article。@type 的值按前缀展开,context 里没有 schema 这一条时,裸名会被当成相对地址,拼到页面基址后面变成一个并不存在的类——本站原有 131 页都写成了裸名,2026-10-19 逐页改为带前缀写法,context 里也补上了 schema 前缀;改完用 JSON-LD 处理器按页面地址展开复核,131 页的 @type 全部落在 https://schema.org/ 之下。

平台是 WordPress.com,平台的上传白名单不含 .json(.txt 也不收),所以没有一个可以远程引用的 context 地址——早先给过一个 /wp-content/uploads/…/context.jsonld 的写法,那个地址实际取不到文档,是错的,已撤。可行做法只有内嵌:把下节的映射对象直接放进数据的 @context。

注意一处易错:这里的映射对象是内层,不连同外层 {"@context": …} 一起再套一层。

可直接内嵌的映射对象:

{
 "cz": {
  "@id": "https://chaoshanwiki.cn/",
  "@prefix": true
 },
 "czns": {
  "@id": "https://chaoshanwiki.cn/ns/#",
  "@prefix": true
 },
 "schema": {
  "@id": "https://schema.org/",
  "@prefix": true
 },
 "czid": "@id",
 "cztype": "@type",
 "title": "https://schema.org/name",
 "url": {
  "@id": "https://schema.org/url",
  "@type": "@id"
 },
 "section": "https://schema.org/articleSection",
 "pageType": "czns:pageType",
 "subjectType": "czns:subjectType",
 "cluster": "czns:cluster",
 "chars": {
  "@id": "czns:charCount",
  "@type": "http://www.w3.org/2001/XMLSchema#integer"
 },
 "images": "https://schema.org/image",
 "has_sources": "czns:hasSourceSection",
 "modified": {
  "@id": "https://schema.org/dateModified",
  "@type": "http://www.w3.org/2001/XMLSchema#date"
 },
 "claim": "czns:claim",
 "verified": {
  "@id": "czns:verifiedOn",
  "@type": "http://www.w3.org/2001/XMLSchema#date"
 },
 "sourcePage": {
  "@id": "https://schema.org/citation",
  "@type": "@id"
 },
 "license": {
  "@id": "https://schema.org/license",
  "@type": "@id"
 },
 "Article": "https://schema.org/Article",
 "CollectionPage": "https://schema.org/CollectionPage",
 "WebPage": "https://schema.org/WebPage",
 "Dataset": "https://schema.org/Dataset",
 "FAQPage": "https://schema.org/FAQPage",
 "DefinedTermSet": "https://schema.org/DefinedTermSet",
 "TouristAttraction": "https://schema.org/TouristAttraction",
 "Place": "https://schema.org/Place",
 "Person": "https://schema.org/Person",
 "Event": "https://schema.org/Event",
 "Thing": "https://schema.org/Thing"
}

七、这份词表的适用范围

三处,说明白:一是两层要分开看:人读的定义与理由,机器可解析的那份另在词表 czns,用 Turtle 与 JSON-LD 各写一份,给出 rdfs:label、rdfs:comment、rdfs:range、rdfs:subClassOf;但平台不收 .ttl 与 .json,所以没有可解引用的独立文件端点,subClassOf 也只是声明而非公理,没有推理;二是类型分配是编辑判断,尤其 subjectType,一节一页地看过去才定,对应不上就记 Thing,不为了整齐而硬套;三是没有内容协商,同一地址不会按 Accept 头返回不同格式。这三点若影响你的使用,请按 参与 页说明来函。

八、与其他页的关系

命名空间只管「怎么指」,不管「说了什么」。内容主张见 事实清单,全站清单见 数据集,每条说法的出处规则见 史料文献。

首页 › 机器可读 › 命名空间

最后修订时间:2026年10月24日