第 9 章 · 02 本体工程:OWL/SHACL/SKOS 与导出


第 9 章 · 02 本体工程:OWL/SHACL/SKOS 与导出

本节摘要:图谱有了、检索通了,本节装语义质量的守门人与交付的出货口。semantica/ontology/(22 个文件、7927 行)装下本体工程四件事:本体自动生成(六段流水线从数据归纳 schema)、OWL 生成(Web 本体语言,rdflib 序列化 Turtle)、SHACL 约束验证(pyshacl 把"每个人有唯一身份证号"变成机器可查的质量规则)、SKOS 词表本体评估器(健康度评分);semantica/export/(19 个文件)提供 11 种导出——RDF Turtle/JSON-LD/N-Triples/OWL/SHACL/Parquet/Cypher/GraphML/CSV/HTML/距离矩阵,让图谱与整个生态互通。

内容来源:原项目源码 semantica/ontology/ontology_generator.pyowl_generator.pyontology_validator.pyontology_evaluator.pyengine.pysemantica/export/rdf_exporter.pyexport/__init__.pyreport_generator.pydistance_exporter.py

⚠️ 注意:SHACL 验证依赖 pyshacl 是可选 extras——_run_pyshacl 的 ImportError 信息明示 pip install semantica[shacl];Parquet/Arrow 导出器同样条件导入,缺依赖时 export/__init__.py 会以 Mock 类占位并在调用时报错。跑通本节前先确认 extras。

学习目标

阅读完本节,你应当能够:

  1. 说出本体自动生成六段流水线的每段输入输出。
  2. 解释 OWL 生成器如何用 rdflib 把类/属性定义变成 Turtle。
  3. OntologyEngine.to_shacl + validate_graph 走通"定义约束→验证数据"闭环,并举一个基数约束例子。
  4. 区分本体评估器的 completeness/gaps/granularity 三类指标。
  5. 按"下游要什么"从 11 种导出格式里选对出口。

一、本体自动生成:从数据归纳 schema

手写本体慢,OntologyGenerator(ontology_generator.py:47)把它变成六段流水线(模块 docstring 17 行起):

  1. Stage 1 语义网络解析_stage1_parse_semantic_network,239 行):从实体/关系里按类型计数(Counter)提取领域概念与关系模式;
  2. Stage 2 YAML 转定义_stage2_yaml_to_definition,393 行):概念转类定义,ClassInferrer.infer_classes 按出现频次过滤(min_occurrences 默认 2);
  3. Stage 3 定义转类型:映射成 OWL 类型(owl:Class/owl:ObjectProperty/owl:DatatypeProperty),PropertyGenerator 从关系推 ObjectProperty、从属性推 DatatypeProperty(含 XSD 类型嗅探);
  4. Stage 4 层级构建(189 行进度提示):推理父子关系,DFS 检测环形依赖——本体里 A⊂B⊂A 是致命伤;
  5. Stage 5 TTL 生成:rdflib 序列化 Turtle,命名空间前缀绑定;
  6. Stage 6 符号校验:结构验证 + 一致性检查。

入口 generate_ontology(data)(114 行)吃抽取产物,generate_from_graph(graph)(224 行)直接吃知识图谱——schema 是从数据里长出来的,不是先验画出来的。命名归 naming_conventions.py(类 PascalCase、属性 camelCase),IRI 由 namespace_manager.generate_class_iri 统一生成;reuse_manager.py 还会查 FOAF/Dublin Core/Schema.org 目录,能复用的标准词表绝不自造。

二、OWL 生成:语义网的"类型系统"

OWLGenerator(owl_generator.py:53)把类/属性定义编译成 Web 本体语言。generate_owl(95 行)接收 classes/properties 列表,实际序列化走 _generate_with_rdflib(210 行):建 rdflib.Graph、绑定命名空间、逐条加 rdfs:subClassOf(259 行注释处)、domain/range 三元组,export_owl(415 行)落盘。OWL 在这里的角色是图谱的强类型系统:声明"作者是一种 Person""hasAuthor 的定义域是 Book、值域是 Person"之后,下游任何系统(含推理机)都能按同一契约理解你的数据——这是第 5 章 Rete/Datalog 推理与 SHACL 验证的共同地基。

三、SHACL 约束验证:把数据质量变成机器可查

SHACL(Shapes Constraint Language)回答 OWL 不回答的问题——数据必须满足什么约束。ontology 模块两层实现。声明层在 OntologyEngineto_shacl(engine.py:196 行,可 include_inherited 把父类属性形状传播给子类)与 export_shacl(270 行)。验证层在 ontology_validator.py

26 class SHACLViolation: 27 """Represents a single SHACL constraint violation.""" ... 51 class SHACLValidationReport: 54 violations: List[SHACLViolation] = field(default_factory=list) 55 warnings: List[SHACLViolation] = field(default_factory=list) 56 infos: List[SHACLViolation] = field(default_factory=list) ... 138 def _run_pyshacl(data_str, shacl_str, shacl_format="turtle"): ... 158 import pyshacl ... 161 "pyshacl is required for SHACL validation. " 162 "Install it with: pip install semantica[shacl]" ... 181 shacl_g = rdflib.Graph() 182 shacl_g.parse(data=shacl_str, format=...)

报告分 violation/warning/info 三级,summary()(67 行)给一句话结论,explain_violations()(72 行)人话解释每条违例。典型约束形如本节标题那句话:"每个人有唯一身份证号"=sh:PropertyShapesh:path :idCard + sh:maxCount 1 + sh:minCount 1;"身份证号必须是 18 位"=sh:pattern 正则。validate_graph(engine.py:297 行)把数据图对着形状图一跑,数据质量规则从 review 评论变成 CI 里可断言的测试——这正是第 4 章冲突治理想要的"仲裁依据有出处"的语义版。

四、SKOS 词表与本体评估器

SKOS(简单知识组织系统)管"概念体系":add_skos_concept(第 8 章 02 节已拆,triplet_store.py:504)把 prefLabel/altLabel/broader/narrower/related 写成标准三元组;ontology 侧 engine.list_vocabularies(393 行)管理词表。用途即"同义词层"——"AI""人工智能""Artificial Intelligence"三个标签归并到同一 skos:Concept,检索与归一化(第 2 章)都能借力。

本体评估器(ontology_evaluator.py)给本体打健康分:evaluate_ontology(84 行)汇总 coverage score(类/属性/关系覆盖度,88-91 行)与 completeness score_calculate_completeness,176 行);_identify_gaps(206 行)找缺失类目并经 _generate_suggestions(239 行)给出改进建议(如"类粒度过粗——按实例分布建议拆分");evaluate_class_granularity(300 行)评粒度与泛化、evaluate_relation_completeness(332 行)评关系完整度;generate_report(365 行)出报告。还有 competency_questions.py(能力问题)从反方向验证:你关心的问题本体答得上来吗?

五、export:11 种格式出货

semantica/export/(19 个文件)在 __init__.py(231 行 __all__)里列满出口。按"下游是谁"归类:

格式 导出器 下游生态
RDF Turtle / RDF-XML / JSON-LD / N-Triples RDFExporter(RDFSerializer:serialize_to_turtle 304 / rdfxml 455 / jsonld 523 / ntriples 609 行) 语义网、SPARQL 端点、链接数据
OWL OWLExporter(export_ontology 201 行) Protégé、本体推理机
SHACL shapes rdf_exporter.py:1252-1273(按扩展名写文件) 数据质量门禁、CI
Parquet ParquetExporter 数仓、Spark/DuckDB 分析
Cypher / Neo4j CSV Neo4jCSVExporter(export 156、export_nodes/relationships 275/286 行) Neo4j 批量导入
GraphML / GEXF / DOT GraphExporter(export 97 行) Gephi、yEd、graphviz 可视化
CSV CSVExporter 表格世界,人都能打开
HTML 报告 ReportGenerator(formats:html/markdown/json/text,76 行) 交付给非技术干系人
距离矩阵 DistanceExporter(hop 85 / weighted 97 / semantic 110 三种距离) 聚类、嵌入、相似度分析

另有 LPGExporter(86 行,面向 Neo4j/Memgraph 的属性图 JSON)、ArangoAQLExporter(多模型库)、VectorExporter(向量回灌别的向量库)、ArrowExporter、YAMLExporter(语义网络回灌)。两点设计值得一提:其一,rdf_exporter.py 的 NamespaceManager(74-78 行)让 semantica: 前缀复用 ProvenanceManager 的 DEFAULT_BASE_URI——KG 导出与 PROV-O 导出的同一实体 URI 能对上,第 7 章溯源链在导出后不断裂;其二,所有导出器同构(export(data, path, format=...)),与第 8 章存储后端如出一辙——polyglot 的不止存储,还有交付

💡 装配要点:本体工程闭环五步——数据(Stage1-4)归纳出 schema → OWL 固化类型契约 → SHACL 写质量规则并进 CI → SKOS 管同义词 → 评估器打健康分;交付则按下游选格式:语义网走 Turtle/JSON-LD、数仓走 Parquet、Neo4j 走 Cypher/CSV、可视化走 GraphML、老板走 HTML。URI 贯穿溯源与导出,别让前缀分家。

本节要点回顾

  1. 六段生成流水线:语义网络解析→YAML 转定义→定义转 OWL 类型→层级构建(DFS 防环)→TTL 生成→符号校验;generate_from_graph 可直接吃图谱。
  2. OWL:rdflib 编译类/属性为 Turtle,是图谱的强类型契约与推理地基。
  3. SHACLto_shacl/export_shacl 声明形状,_run_pyshacl(ontology_validator.py:138)三级报告 + 人话解释;基数/正则约束让"唯一身份证号"可机检。
  4. SKOS:prefLabel/altLabel/broader/narrower 标准三元组,管同义词与概念层级。
  5. 评估器:coverage/completeness 双评分、gap 识别带建议、粒度与关系完整度分项、能力问题反向验证。
  6. 11 种导出:Turtle/JSON-LD/N-Triples/OWL/SHACL/Parquet/Cypher/GraphML/CSV/HTML/距离矩阵;semantica: 前缀与 PROV-O 同源保证溯源 URI 全链一致。

下一节:第 9 章装完检索与本体,管线的可运行部分全部就绪。第 10 章逛生态——explorer 图工作台把你的图谱变成可视战场,MCP 把它交到任何 Agent 手里,CLI 与 deploy 把它送上生产线。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U