如何在RDF/Wikibase中智能编码学术学期以支持SPARQL查询?
方案1:创建独立学术学期实体
为每个学术学期(如「1890-1891学年第1学期」)创建单独的Item,给每个学期实体添加以下属性:
- 自定义「学年」属性:关联对应学年实体或直接填写字符串值
- 自定义「学期序号」属性:标记1/2(或秋季/春季等)
- 复用
P580(开始时间)和P582(结束时间):填写该学期的近似起止日期(如秋季学期设为当年9月1日,春季为次年2月1日)
在编码授课关系时,使用「教授课程」属性(可自定义或复用现有属性),并通过两个限定词:
- 自定义「开始学期」:关联授课起始的学期实体
- 自定义「结束学期」:关联授课结束的学期实体
优势:语义完全贴合学术学期的实际概念,支持精确的学期层级查询(如跨学年的连续授课),后续扩展其他学期相关数据(如选课人数)更方便。
劣势:需要预先批量创建所有涉及的学期实体,初期工作量较大。
SPARQL查询示例(查找1891-1892学年第1学期至1892-1893学年第1学期教授course_A的人):
SELECT ?prof ?profLabel WHERE { ?prof wdt:PXXX wd:course_A ; # 替换PXXX为你的「教授课程」属性ID p:PXXX ?stmt . ?stmt ps:PXXX wd:course_A ; pq:PstartSemester ?startSem ; pq:PendSemester ?endSem . # 通过学期的近似日期过滤区间 ?startSem wdt:P580 ?startDate . ?endSem wdt:P582 ?endDate . # 目标区间:1891-92第1学期(1891-09-01)至1892-93第1学期(1892-09-01) FILTER (?startDate <= "1892-09-01"^^xsd:date && ?endDate >= "1891-09-01"^^xsd:date) SERVICE wikibase:label { bd:serviceParam wikibase:language "zh" . } }
方案2:将学期映射为时间点值
跳过学期实体创建,直接将每个学期映射为一个标准化的时间点:
- 学年第1学期(秋季):统一设为当年9月1日,如「1890-1891学年第1学期」→
1890-09-01 - 学年第2学期(春季):统一设为次年2月1日,如「1890-1891学年第2学期」→
1891-02-01
编码授课关系时,直接用P580(开始时间)和P582(结束时间)作为限定词,填写对应学期的时间点。
优势:无需额外创建实体,直接复用Wikidata标准属性,SPARQL时间范围查询极其简洁,适合快速搭建数据集。
劣势:丢失了「学期」的语义属性,仅能通过时间点近似表示,若研究涉及不同学校的学期差异(如起止日期不同),会存在精度问题。
SPARQL查询示例:
SELECT ?prof ?profLabel WHERE { ?prof wdt:PXXX wd:course_A ; p:PXXX ?stmt . ?stmt ps:PXXX wd:course_A ; pq:P580 ?startTime ; pq:P582 ?endTime . FILTER (?startTime <= "1892-09-01"^^xsd:date && ?endTime >= "1891-09-01"^^xsd:date) SERVICE wikibase:label { bd:serviceParam wikibase:language "zh" . } }
方案3:自定义标准化学期字符串属性
自定义一个「学术学期」属性(类型为String),采用统一格式编码学期,例如:YYYY-YYYY-SX(如1890-1891-S1代表1890-1891学年第1学期)。
编码时,可选择两种方式:
- 用单个「授课学期范围」属性,填写如
1890-1891-S1~1893-1894-S2的字符串 - 拆分为「起始学期」和「结束学期」两个属性,分别填写对应字符串
同时可给每个学期字符串关联近似日期(通过额外属性或注释),辅助时间范围查询。
优势:兼顾语义表达和查询便捷性,无需创建大量实体,适合中小规模数据集;字符串格式统一后,可直接通过字符串排序/过滤实现区间查询。
劣势:对字符串格式的规范性要求极高,若出现格式不一致会导致查询失效;无法直接复用Wikidata的时间属性工具链。
SPARQL查询示例:
SELECT ?prof ?profLabel WHERE { ?prof wdt:PXXX wd:course_A ; p:PXXX ?stmt . ?stmt ps:PXXX wd:course_A ; pq:PstartSem ?startSemStr ; pq:PendSem ?endSemStr . # 利用字符串字典序过滤(需保证格式统一) FILTER (?startSemStr <= "1892-1893-S1" && ?endSemStr >= "1891-1892-S1") SERVICE wikibase:label { bd:serviceParam wikibase:language "zh" . } }
方案选择建议
- 若研究涉及大量学期数据,且需要严格的语义关联(如关联学期的其他属性),优先选方案1
- 若追求快速落地、简单查询,且研究范围内学期起止标准统一,优先选方案2
- 若想平衡语义和工作量,且数据集规模中等,选方案3
内容的提问来源于stack exchange,提问作者Instanton

