本节摘要:图谱有了、检索通了,本节装语义质量的守门人与交付的出货口。
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.py、owl_generator.py、ontology_validator.py、ontology_evaluator.py、engine.py、semantica/export/rdf_exporter.py、export/__init__.py、report_generator.py、distance_exporter.py。
⚠️ 注意:SHACL 验证依赖 pyshacl 是可选 extras——
_run_pyshacl的 ImportError 信息明示pip install semantica[shacl];Parquet/Arrow 导出器同样条件导入,缺依赖时export/__init__.py会以 Mock 类占位并在调用时报错。跑通本节前先确认 extras。
阅读完本节,你应当能够:
OntologyEngine.to_shacl + validate_graph 走通"定义约束→验证数据"闭环,并举一个基数约束例子。手写本体慢,OntologyGenerator(ontology_generator.py:47)把它变成六段流水线(模块 docstring 17 行起):
_stage1_parse_semantic_network,239 行):从实体/关系里按类型计数(Counter)提取领域概念与关系模式;_stage2_yaml_to_definition,393 行):概念转类定义,ClassInferrer.infer_classes 按出现频次过滤(min_occurrences 默认 2);owl:Class/owl:ObjectProperty/owl:DatatypeProperty),PropertyGenerator 从关系推 ObjectProperty、从属性推 DatatypeProperty(含 XSD 类型嗅探);入口 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 目录,能复用的标准词表绝不自造。
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(Shapes Constraint Language)回答 OWL 不回答的问题——数据必须满足什么约束。ontology 模块两层实现。声明层在 OntologyEngine:to_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:PropertyShape 上 sh:path :idCard + sh:maxCount 1 + sh:minCount 1;"身份证号必须是 18 位"=sh:pattern 正则。validate_graph(engine.py:297 行)把数据图对着形状图一跑,数据质量规则从 review 评论变成 CI 里可断言的测试——这正是第 4 章冲突治理想要的"仲裁依据有出处"的语义版。
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(能力问题)从反方向验证:你关心的问题本体答得上来吗?
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 贯穿溯源与导出,别让前缀分家。
generate_from_graph 可直接吃图谱。to_shacl/export_shacl 声明形状,_run_pyshacl(ontology_validator.py:138)三级报告 + 人话解释;基数/正则约束让"唯一身份证号"可机检。semantica: 前缀与 PROV-O 同源保证溯源 URI 全链一致。下一节:第 9 章装完检索与本体,管线的可运行部分全部就绪。第 10 章逛生态——explorer 图工作台把你的图谱变成可视战场,MCP 把它交到任何 Agent 手里,CLI 与 deploy 把它送上生产线。