Semantica 本体建模:不写 Schema,自动推断类层级并导出 Turtle
【免费下载链接】semanticaGraph-Native Infrastructure for Context and Accountable AI Systems项目地址: https://gitcode.com/GitHub_Trending/sema/semantica
实体和关系刚灌进图数据库,麻烦就来了:同一概念有人写 Person 有人写 threat_actor,评分字段没人把关,"Malware 是软件"这种常识推理引擎无从得知。Semantica 的本体建模专治这类问题:不手写 schema,直接从已有实体和关系数据自动推断出类与层级,最后导出标准 Turtle,交给 SHACL(一种校验数据是否"合身"的约束语言)和推理引擎使用。
本体不该手写,该从数据里长出来
传统做法是先请领域专家画好 schema,再往里面填数据。Semantica 的思路反了过来:本体是从数据里"长"出来的。它会扫描你已有的实体和关系,统计每种类型出现得多频繁,把高频类型提拔为类,把关系转成属性,父子类关系靠模式推断——你只负责验收,不负责起稿。
本体里只有三类构件,对应 OWL(W3C 制定的本体描述语言)里的三种声明:
| 构件 | 作用 | 生活化例子 |
|---|---|---|
| 类(owl:Class) | 给实体定类型,回答"这是什么" | 通讯录里的分组:同事、家人、供应商 |
| 对象属性(owl:ObjectProperty) | 两个实体之间的连边 | 联系人卡片上"就职于→某公司"这条线 |
| 数据属性(owl:DatatypeProperty) | 实体身上的字面量字段 | 姓名(文本)、入职日期(日期) |
类与类之间还能形成继承关系,比如"恶意软件 是 软件 的子类"——这正是推理引擎最需要的常识来源。
最小可运行流程
克隆仓库git clone https://gitcode.com/GitHub_Trending/sema/semantica,进入目录后pip install -e .即可。如果数据来自文档、网页或数据库,可以先用 semantica/ingest/ 摄取模块抽出实体与关系,再喂给生成器;最简输入就是一个装着entities和relationships的字典:
from semantica.ontology import OntologyGenerator gen = OntologyGenerator(base_uri="https://example.org/ontology/", min_occurrences=1) data = { "entities": [ {"id": "e1", "name": "Alice", "type": "Person"}, {"id": "e2", "name": "Acme", "type": "Company"}, ], "relationships": [{"source_id": "e1", "target_id": "e2", "type": "works_for"}], } ontology = gen.generate_ontology(data, name="OrgOntology", build_hierarchy=True)min_occurrences是出现次数门槛,设为 1 表示每个出现过的类型都升格为类。这一次调用内部跑完 6 个阶段,每段只干一件事:
- 语义网络解析——从实体和关系里提取领域概念
- 概念转定义——把概念整理成类定义
- 定义映射类型——归到 owl:Class、对象属性、数据属性
- 层级生成——推断父子类并做循环依赖检测
- TTL 生成——序列化为 Turtle 语法
- 符号校验——一致性检查
流水线细节在 semantica/ontology/ontology_generator.py。
生成的本体长什么样
返回值是个普通字典,但每部分各有分工:
- classes:例子里得到 Person 和 Company 两个类,各带名称、IRI 与可能的父类
- properties:对象属性
works_for(domain 为 Person、range 为 Company),外加数据属性name(范围是 string) - base_uri:生成时设定的"地址前缀",所有类的 IRI 都按 base_uri 拼本地名生成
IRI(国际资源标识符)是语义网里给实体起的"完整地址",多套本体因此能共存于同一三元组库而不撞名。导出的 Turtle(一种紧凑可读的 RDF 三元组文本格式)开头大致长这样:
@prefix ex: <https://example.org/ontology/> . ex:Person a owl:Class . ex:works_for a owl:ObjectProperty ; rdfs:domain ex:Person ; rdfs:range ex:Company . ex:name a owl:DatatypeProperty ; rdfs:range xsd:string .导出前先自检
导出前先跑一次结构校验,成本低、防翻车:
from semantica.ontology import validate_ontology result = validate_ontology(ontology) print(result["valid"], result["warnings"])返回 valid、consistent、satisfiable 三个布尔量,外加 errors 与 warnings 列表。几个典型警告和处理办法:
| 警告 | 含义 | 处理 |
|---|---|---|
| "Ontology has no classes defined" | 输入数据里没找到实体类型 | 检查实体是否漏了 type 字段 |
| 某类没有声明数据属性 | 类被推断出来,但节点上没有任何属性值 | 用 PropertyGenerator 手动补属性,或接受现状 |
| "Ontology has no properties defined" | 缺少关系数据 | 补全 relationships 后重新生成 |
校验逻辑在 semantica/ontology/ontology_validator.py。
Turtle 通向哪里
四种常用导出格式,各自对应不同的下游:
- turtle:紧凑、人类可读,SHACL 形状校验和三元组库加载的首选
- owl-xml`:Protégé 和 HermiT 这类推理器对它最友好,适合做深度推理的 OWL 生成
- jsonld:面向 Web API 与链接数据,前端渲染友好
- ntriples:一行一个三元组,批量灌库效率最高
具体函数在 semantica/export/:export_rdf(..., format=...)覆盖上面四种 RDF 格式,export_owl(..., format="owl-xml")产出 OWL/XML。完整说明见 docs/guides/export.md。
让本体跟着图谱长大
🌱增量扩展:图谱长出新实体类型时不必整库重跑。调ClassInferrer().infer_classes(new_entities)只对新批次做类推断,人工修正父类后再合并进已有本体,本体就能随图谱一起生长。
🤖LLM 冷启动:完全没有结构化数据时,LLMOntologyGenerator可以从纯文本直接抽取类和属性,适合新领域起步;一旦有了图谱,优先改用generate_from_graph()——确定性、可复现,也不耗 token。
new_classes = ClassInferrer().infer_classes(new_entities) llm_gen = LLMOntologyGenerator(provider="groq", model="llama-3.1-8b-instant") llm_ontology = llm_gen.generate_ontology_from_text("APT29 使用 HAMMERTOSS 恶意软件……")踩坑清单
| 坑 | 典型表现 | 应对 |
|---|---|---|
| 过度建模 | 10 个类能解决的事硬造 50 个 | 从简开始,需要形式化区分时再细化 |
| 本体漂移 | 图谱冒出新类型,本体还停在旧版 | 监控新类型,定期增量推断合并 |
| 命名混乱 | ThreatActor 与 threat_actor 混用 | 定下约定(类 PascalCase、属性 camelCase)并坚持 |
再养几个习惯:
- ✅ 生成后先跑
validate_ontology再导出 - 用
min_occurrences过滤低频噪声类,出现一两次未必配得上独立成类 - 尽早写下胜任问题(你希望本体回答的问题),用 OntologyEvaluator 评估覆盖度
- 命名约定统一执行,代码层已内置 PascalCase / camelCase 的强制检查
回到开头那个没人把关的图谱:自动类推断、结构自检、Turtle 导出,三次调用就能得到一份可被推理引擎消费的本体。源码在 semantica/ontology/,指南在 docs/guides/ontology.md,动手示例在 cookbook/introduction/14_Ontology.ipynb。
【免费下载链接】semanticaGraph-Native Infrastructure for Context and Accountable AI Systems项目地址: https://gitcode.com/GitHub_Trending/sema/semantica
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考