一文读懂本体建模到落地
导读:你可能已经往向量库里导入几百份知识文档,大模型却依然答不出“TA-5142 利用的漏洞,影响了谁家开发的产品”,不是它读得不够多,而是多跳关系不在向量里。怎么把企业知识从“一堆文档”变成“一张能被推理的图”。本文从本体 / 图谱 / 业务数据 / RAG 等概念开始,再用 OWL / RDF / SHACL / Turtle 四种技术语言,以威胁情报为例,深入论述从实体建模做到落库过程。
案例设定:五条原始情报事实
本文所有概念和示例都围绕下面这组威胁情报事实展开:后文出现的 TA-5142、CVE-2024-3400、PAN-OS 等实体都来自这里,先放在开头便于对照。
“TA-5142 is a financially motivated threat actor targeting Taotao, an e-commerce company.”(TA-5142 是以经济利益为目的的威胁组织,目标为电商企业 Taotao)
“CVE-2024-3400 is a critical vulnerability in PAN-OS exploited by TA-5142.”(CVE-2024-3400 是 PAN-OS 关键漏洞,被 TA-5142 利用)
“CVE-2024-3401 is a minor vulnerability in PAN-OS exploited by TA-5142.”(CVE-2024-3401 是 PAN-OS 低危漏洞,被 TA-5142 利用)
“HAMMERTOSS is a backdoor malware family used by TA-5142 for C2 over Twitter.”(HAMMERTOSS 是 TA-5142 用于经 Twitter C2 的后门家族)
“PAN-OS is a network operating system developed by Palo Alto Networks.”(PAN-OS 是 Palo Alto Networks 开发的网络操作系统)
一、概念说明
1.1 本体(Ontology)
- 是什么:对某个领域内概念、概念间关系、属性、实例的显式形式化规格说明,可理解为企业的“统一语言模型”。
- 四要素:类(概念,如 ThreatActor/Vulnerability)、关系(如 exploits/affects)、属性(如 severity/cveId)、实例(如 TA-5142/CVE-2024-3400)。
- 一句话:本体是知识图谱的 Schema(图纸),管“形”。
1.2 图谱(知识图谱)
- 是什么:本体(图纸)+ 实例(大楼),用“实体-关系-实体”三元组组织知识,支持多跳查询与推理。
- 举例:
TA-5142–exploits–>CVE-2024-3400–affects–>PAN-OS这条链,就是图谱路径;“TA-5142 利用的漏洞影响的产品的厂商是谁”这类跨实体多跳问题,只有图谱能答。 - 一句话:本体是图纸,知识图谱是“图纸 + 建成的大楼”;图谱管“关联与推理”。
1.3 业务数据
- 是什么:企业系统里正在跑的事实与值——工单、缺陷、漏洞库记录、厂商资料等,是“数据权威”。
- 与图谱的关系:业务数据管“值”(事实),图谱管“关系”(关联)。图谱是瘦视图——只把支撑关系查询/推理的实体、关系、关键属性放进去,明细留在业务库靠
sourceKey回源,不需要全量同步。
1.4 RAG(检索增强生成)
- 是什么:让大模型先检索企业私有知识,再基于检索结果生成答案,解决“模型不知道私有知识 / 幻觉 / 无法更新”三大问题。
- 局限:纯向量 RAG 抓不住“跨实体多跳关系”——这正是图谱补位的地方(GraphRAG 融合:向量管模糊召回、图谱管关系与多跳)。
1.5 四者的联系和区别
本体(Schema/图纸:概念/属性/关系/约束) ──图纸──► 知识图谱 = 本体 + 实例(大楼)
业务数据(权威值:漏洞/厂商/情报记录) ──物化实例──► 图谱实例
非结构化文档(威胁情报原文) ──两阶段抽取──► 图谱实例(知识)
图谱 + 向量 ──融合──► RAG(先检索再生成,答案带引用可溯源)
两阶段抽取:先用规则 / 词典把 CVE 编号、IP、域名这类“长得规范”的东西摘出来——几乎零成本、可复现、不会幻觉;剩下的自然语言再交给 LLM,按冻结好的本体抽实体与关系——灵活、高召回,但会幻觉,输出必须落在 Schema 内并过质量门禁(§2.4 SHACL)。一句话:规则保精度,LLM 保召回。
| 维度 | 本体 | 图谱 | 业务数据 | RAG |
|---|---|---|---|---|
| 问题域 | 有哪些概念/关系/约束 | 实体之间实际什么关系 | 事实的当前值是什么 | 怎么让模型答得准 |
| 分层 | Schema / 模式层 | Schema + 实例 | 数据源 / 权威库 | 应用层 / 检索生成 |
| 比喻 | 图纸 | 建成的大楼 | 建筑材料(砖瓦) | 装修队(按图纸+建材盖楼) |
| 典型能力 | OWL 推理、一致性 | 多跳查询、路径推理 | 增删改查、事务、回源 | 语义召回、生成、防幻觉 |
| 治理对象 | 概念与公理 | 实体与事实 | 数据质量 | 检索效果与引用 |
一句话:本体管“形”、业务数据管“值”、图谱是两者的交汇、RAG 是最终让 AI 用起来的那一层。
二、建模语言:OWL / RDF / SHACL / Turtle
2.1 四层关系总览
| 语言 | 回答的问题 | 层面 | 一句话 |
|---|---|---|---|
| OWL | 领域语义怎么定义 | 本体层 | 定义领域里有哪些类、哪些属性、什么约束 |
| RDF | 数据怎么表示 | 数据层 | 以“图”的形式存三元组(主体 → 谓语 → 宾语) |
| SHACL | 数据怎么校验 | 校验层 | 针对具体类定义“形状”,规定它必须满足的约束 |
| Turtle | 怎么读写 | 语法层 | 人类可读的 RDF 图数据 / SHACL 形状的文件格式 |
协作关系:
Turtle 写出来 ──► OWL 本体(类/属性/约束) ← 本体层:Schema
Turtle 写出来 ──► RDF 图数据(三元组) ← 数据层:事实
Turtle 写出来 ──► SHACL 形状(验证规则) ← 校验层:质量门禁
- OWL 管“这张图里有什么定义”:哪些是类、类怎么分层、属性属于谁、属性有什么特征。
- RDF 管“这张图画了什么连接”:一个主语、一个谓语、一个宾语,组成一张无边无际的图。
- SHACL 管“这张图合不合规”:对特定类下校验规则,违规即输出报告(数据质量门禁)。
- Turtle 管“这些东西用什么格式写出来”:以上三者都能用 Turtle 表达,且人眼可读。
区别:Neo4j 用“节点 + 关系 + 属性”;RDF 用“三元组”,IRI 全局唯一标识每个资源,天然适合跨系统、跨标准的语义互操作。
命名空间前缀(namespace prefix):cti: / rdf: / owl: 是什么意思
RDF/Turtle 里 @prefix 前缀: <完整IRI> . 声明后,前缀:名字 就等价于 完整IRI + 名字,前缀是缩写,让长 IRI 短小可读(类似代码里 import pandas as pd 后写 pd 不写全名)。
| 前缀 | 完整 IRI | 是什么 | 常见用法 |
|---|---|---|---|
cti: |
https://cti.example.org/ |
领域自定义命名空间(本文威胁情报) | cti:TA-5142、cti:exploits、cti:ThreatActor |
rdf: |
http://www.w3.org/1999/02/22-rdf-syntax-ns# |
W3C 标准:RDF 基础词汇 | rdf:type(简写 a)——“某某是某类” |
rdfs: |
http://www.w3.org/2000/01/rdf-schema# |
W3C 标准:RDF Schema 词汇 | rdfs:subClassOf、rdfs:domain、rdfs:range |
owl: |
http://www.w3.org/2002/07/owl# |
W3C 标准:OWL 本体词汇 | owl:Class、owl:ObjectProperty、owl:inverseOf |
xsd: |
http://www.w3.org/2001/XMLSchema# |
W3C 标准:XML 数据类型 | xsd:decimal、xsd:string、xsd:dateTime |
sh: |
http://www.w3.org/ns/shacl# |
W3C 标准:SHACL 校验词汇 | sh:NodeShape、sh:targetClass、sh:minCount |
关键区别:rdf: / rdfs: / owl: / xsd: / sh: 是 W3C 标准词汇,全世界的本体引用同一套 IRI,机器才能互通,你永远不该自己定义 owl:Class 的含义;cti: 是你的领域自定义命名空间,ThreatActor、exploits 是你为领域造的类/属性,挂在自选域名下。
展开看(§2.3 的三条事实):
cti:TA-5142 rdf:type cti:ThreatActor .
cti:TA-5142 cti:exploits cti:CVE-2024-3400 .
等价于完整 IRI 写法:
<https://cti.example.org/TA-5142>
<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
<https://cti.example.org/ThreatActor> .
为什么必须前缀:IRI 是 RDF 全局唯一标识资源的方式(类似主键),但整串写出来又长又难读——前缀就是给长 IRI 起的别名。
2.2 OWL —— Web 本体语言
定义:OWL(Web Ontology Language):一种用于构建本体的语言。它定义了领域中存在的类(Class)和属性(Property),并可用逻辑公理表达“什么东西必须、可能与什么有关”。
类(Class):有哪些概念
cti:Malware rdf:type owl:Class . # 概念:恶意软件
cti:Backdoor rdf:type owl:Class ;
rdfs:subClassOf cti:Malware . # 概念层级:后门 是 恶意软件的子类
cti:Vulnerability rdf:type owl:Class .
cti:Product rdf:type owl:Class ;
owl:disjointWith cti:Vulnerability . # 不相交:产品不可能是漏洞
说明:subClassOf 建立 is-a 层级;equivalentClass 表达类语义等价(跨本体对齐);disjointWith 表达类互斥。
属性(Property):有什么关系
对象属性(个体 ↔ 个体):
cti:exploits rdf:type owl:ObjectProperty ;
rdfs:domain cti:ThreatActor ; # 主体的类型约束
rdfs:range cti:Vulnerability ; # 客体的类型约束
owl:inverseOf cti:exploitedBy . # 逆属性:A exploits B ⟺ B exploitedBy A
数据属性(个体 ↔ 字面量):
cti:confidence rdf:type owl:DatatypeProperty ;
rdfs:domain cti:ExtractedFact ; # 只挂在"抽取事实"上
rdfs:range xsd:decimal . # 值必须是小数
属性特征公理(RBox):
| 公理 | 含义 | 例子 |
|---|---|---|
owl:TransitiveProperty |
传递:A→B→C 则 A→C | partOf |
owl:SymmetricProperty |
对称:A↔B 则 B↔A | interactsWith |
owl:FunctionalProperty |
函数性:最多一个值 | 一个事实的 confidence 只有一个值 |
owl:InverseFunctionalProperty |
逆函数:值能唯一反推主体 | 工号唯一对应员工 |
约束(Restrictions):OWL 用“匿名限制类”表达业务规则,某类的成员必须满足这些条件:
# 规则:任何 Vulnerability 至少影响一个产品(affects 最小基数 1)
cti:Vulnerability rdf:type owl:Class ;
rdfs:subClassOf [
rdf:type owl:Restriction ;
owl:onProperty cti:affects ;
owl:minCardinality 1
] .
- 量词:
owl:someValuesFrom/owl:allValuesFrom; - 基数:
owl:minCardinality/owl:maxCardinality/owl:cardinality; - 取值:
owl:hasValue。
TBox / ABox:术语盒与断言盒(OWL 的两层结构):
描述逻辑(OWL 的语义基础)把本体拆成两个盒子,这是理解“本体 vs 图谱”的底层框架:
| 盒子 | 全称 | 存什么 | 类比 |
|---|---|---|---|
| TBox | Terminological Box(术语盒) | 模式层:类、属性、约束、公理(是“哪些概念、什么关系、什么规矩”) | 图纸 / Schema |
| ABox | Assertional Box(断言盒) | 实例层:具体个体 + 事实断言(是“谁、和谁、有什么关系”) | 建成的大楼 / 数据 |
对应到 OWL/RDF 文件里:
TBox 就是类与属性声明(a owl:Class / a owl:ObjectProperty + subClassOf + 约束),ABox 就是个体与断言(cti:TA-5142 a cti:ThreatActor + cti:TA-5142 cti:exploits cti:CVE-2024-3400)。
用第三章威胁情报样例对照(详见 §3.7):
# —— TBox:定义模式(哪些概念、什么关系、什么约束)——
cti:ThreatActor a owl:Class . # 概念:威胁行为体
cti:Vulnerability a owl:Class . # 概念:漏洞
cti:exploits a owl:ObjectProperty ; # 关系:利用
rdfs:domain cti:ThreatActor ;
rdfs:range cti:Vulnerability .
cti:Vulnerability a owl:Class ;
rdfs:subClassOf [ a owl:Restriction ;
owl:onProperty cti:affects ; owl:minCardinality 1 ] . # 约束:漏洞必须影响产品
# —— ABox:填实例(谁、和谁、什么关系)——
cti:TA-5142 a cti:ThreatActor . # 个体:TA-5142 是威胁行为体
cti:CVE-2024-3400 a cti:Vulnerability . # 个体:CVE-2024-3400 是漏洞
cti:TA-5142 cti:exploits cti:CVE-2024-3400 . # 断言:TA-5142 利用 CVE-2024-3400
工程意义(为什么分开):
- TBox 演进不动 ABox:新增一个类/关系只改 TBox,已有实例事实(ABox)无需重写——Schema 版本演进与数据解耦。
- 先冻结 TBox 再灌 ABox:本体经专家评审冻结(G2 门禁)后,才允许抽取填实例,避免“边建边抽”导致 Schema 漂移。
- 校验分层:SHACL 针对 ABox 里的个体做形状校验(数据层门禁);OWL 针对 TBox 做一致性检查(模式层正确性)。
- 本文 §6.3“落地要点”第 1 条“TBox / ABox 分离”即此意。
2.3 RDF —— 资源描述框架(数据层)
定义:RDF(Resource Description Framework):一种以图形式表示数据的标准方式。它将信息视为连接的三元组:
Subject(主体)→ Predicate(谓语)→ Object(客体)
- 主体与客体都是图中的节点,谓语是有向边;每个三元组就是一个“事实”;资源用 IRI 全局唯一标识,客体也可以是字面量。
具体示例(Turtle 语法):
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix cti: <https://cti.example.org/> .
# 三条事实(三元组)
cti:TA-5142 rdf:type cti:ThreatActor . # 事实1:类型
cti:TA-5142 cti:exploits cti:CVE-2024-3400 . # 事实2:利用
cti:CVE-2024-3400 cti:affects cti:PAN-OS . # 事实3:影响
对应的图(一条边 = 一个三元组):
TA-5142 ──exploits──► CVE-2024-3400 ──affects──► PAN-OS └──rdf:type──► ThreatActor
RDF vs 属性图(选型视角):
| 维度 | RDF 三元组 | 属性图(Neo4j 等) |
|---|---|---|
| 结构 | 三元组,边也是资源(可被引用) | 节点 + 关系,关系不可单独引用 |
| 标识 | IRI 全局唯一,天然支持跨系统融合 | 节点 ID 通常库内唯一 |
| 语义标准 | 与 OWL/SHACL/SPARQL 组成 W3C 标准栈 | 图内自带 Schema,标准化弱 |
| 推理 | 支持 OWL 推理 | 无标准推理,靠 Cypher 逻辑 |
| 适合 | 跨系统语义互操作、本体治理、严格校验 | 业务图谱、快速开发、路径分析 |
2.4 SHACL —— 形状约束语言(校验层)
定义:SHACL(Shapes Constraint Language):实际的验证规则。“形状”(Shape)针对数据中的特定类,定义它必须遵循的约束。
- 与 OWL 的本质区别:OWL 是逻辑公理(告诉推理机“能推出什么”),SHACL 是形状约束(告诉校验器“必须长什么样”)。
- 校验结果输出验证报告:哪条形状、哪个节点、违反了哪个约束、具体值是什么——可直接对接数据质量门禁。
具体示例:
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix cti: <https://cti.example.org/> .
# 形状:针对 Vulnerability 类
cti:VulnerabilityShape rdf:type sh:NodeShape ;
sh:targetClass cti:Vulnerability ; # 校验谁:所有 Vulnerability 实例
# 规则1:必须有 cveId,且格式必须匹配
sh:property [
sh:path cti:cveId ;
sh:minCount 1 ; # 至少 1 个
sh:maxCount 1 ; # 恰好 1 个
sh:pattern "^CVE-\\d{4}-\\d+$" # 值必须是合法 CVE 编号
] ;
# 规则2:必须有 affects(漏洞不能没有影响面)
sh:property [
sh:path cti:affects ;
sh:minCount 1
] ;
# 规则3:置信度必须是 [0,1] 的小数
sh:property [
sh:path cti:confidence ;
sh:datatype xsd:decimal ;
sh:minInclusive 0 ;
sh:maxInclusive 1
] .
SHACL vs OWL:
| 维度 | OWL | SHACL |
|---|---|---|
| 定位 | 语义定义 + 逻辑推理 | 数据形状校验 |
| 输出 | 推理出的新事实 / 一致性 | 验证报告(谁违规、违反什么) |
| 典型场景 | 定义语义、驱动 NL→SPARQL | 入库前质量门禁、抽取结果抽检 |
2.5 Turtle —— 序列化格式(语法层)
定义:Turtle(.ttl):一种流行的、人类可读的 RDF 图数据和 SHACL 形状文件格式。它是 W3C 标准,是所有示例的载体。
为什么用 Turtle:
- 紧凑可读:用
@prefix缩短 IRI,用分号/逗号/方括号压缩重复主语或谓语。 - 标准互通:与 RDF/XML、JSON-LD、N-Triples 等价,可无损互转。
- 一个格式搞定:Protégé 导出、Oxigraph 导入等都以 Turtle 为主。
语法速记(同一份数据的三种写法):
@prefix cti: <https://cti.example.org/> .
# ① 完整写法:每条独立
cti:TA-5142 cti:exploits cti:CVE-2024-3400 .
cti:TA-5142 cti:uses cti:HAMMERTOSS .
# ② 分号压缩:同一主语,多谓语
cti:TA-5142 cti:exploits cti:CVE-2024-3400 ;
cti:uses cti:HAMMERTOSS .
# ③ 方括号匿名节点:客体可再展开
cti:TA-5142 cti:exploits [ cti:confidence 0.97 ] .
其他序列化格式:
| 格式 | 特点 | 用在哪 |
|---|---|---|
| Turtle (.ttl) | 紧凑、人类可读 | 本体与形状文件的默认选择 |
| JSON-LD | JSON 生态、前后端友好 | Web API、JS 应用 |
| RDF/XML | 最早的标准、冗长 | 兼容老工具(如部分 Protégé 导出) |
| N-Triples (.nt) | 一行一个三元组、最朴素 | 流式大数据处理 |
三、威胁情报领域建模示例
用一套五条威胁情报事实,完整走一遍“输入 → 实体/关系/属性 → JSON → Cypher → 正式语义建模(OWL/RDF/SHACL/Turtle)→ 图谱”的建模链路。
3.1 输入:五条原始情报事实
五条原始事实已在文首「案例设定」列出。本章直接进入建模:先抽实体,再抽关系与属性,最后落成 JSON / Cypher / OWL。
3.2 实体层(Entity Layer)
| 实体 | 实体类型 | 关键属性 |
|---|---|---|
| TA-5142 | ThreatActor(威胁行为体) | motivation=financial、sophistication=high |
| Taotao | Organization(组织) | role=victim、industry=e-commerce |
| CVE-2024-3400 | Vulnerability(漏洞) | severity=critical |
| CVE-2024-3401 | Vulnerability(漏洞) | severity=minor |
| PAN-OS | Product(产品) | kind=network operating system |
| HAMMERTOSS | Malware(恶意软件) | category=backdoor |
| Platform(平台) | role=c2_channel |
|
| Palo Alto Networks | Organization(组织) | role=vendor |
3.3 关系层(Relationship Layer)
| 源实体 | 关系类型 | 目标实体 | 说明 |
|---|---|---|---|
| TA-5142 | targets |
Taotao | 攻击目标,1..N |
| TA-5142 | exploits |
CVE-2024-3400 | 高危漏洞 |
| TA-5142 | exploits |
CVE-2024-3401 | 低危漏洞 |
| CVE-2024-3400 | affects |
PAN-OS | — |
| CVE-2024-3401 | affects |
PAN-OS | — |
| TA-5142 | uses |
HAMMERTOSS | 恶意工具家族 |
| HAMMERTOSS | usesChannel |
channel=c2 |
|
| Palo Alto Networks | develops |
PAN-OS | 与 3.7 的 developedBy 互为逆 |
结构示意:
TA-5142 --targets--> Taotao TA-5142 --exploits--> CVE-2024-3400 --affects--> PAN-OS TA-5142 --exploits--> CVE-2024-3401 --affects--> PAN-OS TA-5142 --uses--> HAMMERTOSS --usesChannel--> Twitter Palo Alto Networks --develops--> PAN-OS
3.4 属性层(Attribute Layer)
| 属性 | 挂载对象 | 类型 | 说明 |
|---|---|---|---|
motivation |
TA-5142 | 数据属性 | 攻击动机(financial) |
sophistication |
TA-5142 | 数据属性 | 技术水平(high) |
role |
Taotao / Twitter / Palo Alto | 数据属性 | victim / c2_channel / vendor |
severity |
CVE-2024-3400/3401 | 数据属性 | critical / minor(OWL 里进一步具体化为 SeverityLevel 个体) |
kind |
PAN-OS | 数据属性 | network operating system |
category |
HAMMERTOSS | 数据属性 | backdoor |
cveId |
Vulnerability | 数据属性 | CVE 编号(SHACL 校验格式) |
sourceDoc / confidence |
ExtractedFact | 数据属性 | 溯源:来源文档 + 置信度 |
本体模式(Schema)归纳:
- 实体类型:
ThreatActor、Organization、Vulnerability、Product、Malware、Platform - 关系类型:
targets、exploits、uses、affects、develops(⟷developedBy)、usesChannel
3.5 JSON 表示(graph.json)
{
"entities": [
{ "id": "TA-5142", "type": "ThreatActor", "properties": { "motivation": "financial", "sophistication": "high" } },
{ "id": "Taotao", "type": "Organization", "properties": { "role": "victim", "industry": "e-commerce" } },
{ "id": "CVE-2024-3400", "type": "Vulnerability","properties": { "cveId": "CVE-2024-3400", "severity": "critical" } },
{ "id": "CVE-2024-3401", "type": "Vulnerability","properties": { "cveId": "CVE-2024-3401", "severity": "minor" } },
{ "id": "PAN-OS", "type": "Product", "properties": { "kind": "network operating system" } },
{ "id": "HAMMERTOSS", "type": "Malware", "properties": { "category": "backdoor" } },
{ "id": "Twitter", "type": "Platform", "properties": { "role": "c2_channel" } },
{ "id": "Palo Alto Networks", "type": "Organization", "properties": { "role": "vendor" } }
],
"relations": [
{ "source": "TA-5142", "type": "targets", "target": "Taotao" },
{ "source": "TA-5142", "type": "exploits", "target": "CVE-2024-3400" },
{ "source": "CVE-2024-3400", "type": "affects", "target": "PAN-OS" },
{ "source": "TA-5142", "type": "exploits", "target": "CVE-2024-3401" },
{ "source": "CVE-2024-3401", "type": "affects", "target": "PAN-OS" },
{ "source": "TA-5142", "type": "uses", "target": "HAMMERTOSS" },
{ "source": "HAMMERTOSS", "type": "usesChannel", "target": "Twitter", "properties": { "channel": "c2" } },
{ "source": "Palo Alto Networks", "type": "develops", "target": "PAN-OS" }
]
}
3.6 Cypher 表示(Neo4j 属性图导入)
CREATE (a:ThreatActor {name:'TA-5142', motivation:'financial', sophistication:'high'})
CREATE (n:Organization {name:'Taotao', role:'victim', industry:'e-commerce'})
CREATE (v1:Vulnerability {cveId:'CVE-2024-3400', severity:'critical'})
CREATE (v2:Vulnerability {cveId:'CVE-2024-3401', severity:'minor'})
CREATE (p:Product {name:'PAN-OS', kind:'network operating system'})
CREATE (m:Malware {name:'HAMMERTOSS', category:'backdoor'})
CREATE (t:Platform {name:'Twitter', role:'c2_channel'})
CREATE (pa:Organization {name:'Palo Alto Networks', role:'vendor'})
CREATE (a)-[:TARGETS]->(n)
CREATE (a)-[:EXPLOITS]->(v1)-[:AFFECTS]->(p)
CREATE (a)-[:EXPLOITS]->(v2)-[:AFFECTS]->(p)
CREATE (a)-[:USES]->(m)-[:USES_CHANNEL {channel:'c2'}]->(t)
CREATE (pa)-[:DEVELOPS]->(p);
3.7 正式语义建模:OWL / RDF / SHACL / Turtle
输入的五条事实与主要三元组的对应关系:
| 陈述 | 主要三元组 |
|---|---|
| TA-5142 是以经济利益为目的的威胁组织,目标为电商企业 Taotao | TA-5142 targets Taotao |
| CVE-2024-3400 是 PAN-OS 关键漏洞,被 TA-5142 利用 | CVE-2024-3400 hasSeverity Critical;affects PAN-OS;exploitedBy TA-5142 |
| CVE-2024-3401 是 PAN-OS 低危漏洞,被 TA-5142 利用 | CVE-2024-3401 hasSeverity Minor;affects PAN-OS;exploitedBy TA-5142 |
| HAMMERTOSS 是 TA-5142 用于经 Twitter C2 的后门家族 | HAMMERTOSS a Backdoor;usedBy TA-5142;implements C2;usesChannel Twitter |
| PAN-OS 是 Palo Alto 开发的网络操作系统 | PAN-OS a Product;developedBy PaloAltoNetworks |
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix cti: <https://cti.example.org/> .
########################
# 第1层:OWL 本体(Schema)
########################
# 类与层级
cti:ThreatActor a owl:Class .
cti:Malware a owl:Class .
cti:Backdoor a owl:Class ; rdfs:subClassOf cti:Malware .
cti:MalwareFamily a owl:Class ; rdfs:subClassOf cti:Malware .
cti:Vulnerability a owl:Class .
cti:Product a owl:Class .
cti:Organization a owl:Class .
cti:AttackPattern a owl:Class .
cti:Platform a owl:Class .
cti:SeverityLevel a owl:Class .
cti:ExtractedFact a owl:Class . # 抽取事实包装(溯源用)
# 对象属性(实体间关系)
cti:targets a owl:ObjectProperty ; rdfs:domain cti:ThreatActor ; rdfs:range cti:Organization .
cti:exploits a owl:ObjectProperty ; rdfs:domain cti:ThreatActor ; rdfs:range cti:Vulnerability .
cti:exploitedBy a owl:ObjectProperty ; owl:inverseOf cti:exploits .
cti:uses a owl:ObjectProperty ; rdfs:domain cti:ThreatActor ; rdfs:range cti:Malware .
cti:usedBy a owl:ObjectProperty ; owl:inverseOf cti:uses .
cti:affects a owl:ObjectProperty ; rdfs:domain cti:Vulnerability ; rdfs:range cti:Product .
cti:affectedBy a owl:ObjectProperty ; owl:inverseOf cti:affects .
cti:developedBy a owl:ObjectProperty ; rdfs:domain cti:Product ; rdfs:range cti:Organization .
cti:hasSeverity a owl:ObjectProperty ; rdfs:domain cti:Vulnerability ; rdfs:range cti:SeverityLevel .
cti:implements a owl:ObjectProperty ; rdfs:domain cti:Malware ; rdfs:range cti:AttackPattern .
cti:usesChannel a owl:ObjectProperty ; rdfs:domain cti:Malware ; rdfs:range cti:Platform .
# 数据属性(数值)
cti:cveId a owl:DatatypeProperty ; rdfs:domain cti:Vulnerability ; rdfs:range xsd:string .
cti:confidence a owl:DatatypeProperty ; rdfs:domain cti:ExtractedFact ; rdfs:range xsd:decimal .
cti:sourceDoc a owl:DatatypeProperty ; rdfs:domain cti:ExtractedFact ; rdfs:range xsd:string .
########################
# 第2层:RDF 实例(ABox)
########################
# 组织
cti:Taotao a cti:Organization ; rdfs:label "Taotao" .
cti:PaloAltoNetworks a cti:Organization ; rdfs:label "Palo Alto Networks" .
# 威胁组织
cti:TA-5142 a cti:ThreatActor ; rdfs:label "TA-5142" ;
cti:targets cti:Taotao ;
cti:uses cti:HAMMERTOSS ;
cti:exploits cti:CVE-2024-3400 , cti:CVE-2024-3401 .
# 漏洞
cti:CVE-2024-3400 a cti:Vulnerability ;
cti:cveId "CVE-2024-3400" ;
cti:affects cti:PAN-OS ;
cti:hasSeverity cti:Critical .
cti:CVE-2024-3401 a cti:Vulnerability ;
cti:cveId "CVE-2024-3401" ;
cti:affects cti:PAN-OS ;
cti:hasSeverity cti:Minor .
cti:Critical a cti:SeverityLevel ; rdfs:label "critical" .
cti:Minor a cti:SeverityLevel ; rdfs:label "minor" .
# 产品
cti:PAN-OS a cti:Product ; rdfs:label "PAN-OS" ;
cti:developedBy cti:PaloAltoNetworks .
# 恶意软件与战术
cti:HAMMERTOSS a cti:Backdoor , cti:MalwareFamily ; rdfs:label "HAMMERTOSS" ;
cti:implements cti:C2 ;
cti:usesChannel cti:Twitter .
cti:C2 a cti:AttackPattern ; rdfs:label "Command-and-Control" .
cti:Twitter a cti:Platform ; rdfs:label "Twitter" .
# 溯源(PROV-O 口径):事实包装体;生产上用命名图 / RDF 具体化把它绑定到具体三元组
cti:fact-1 a cti:ExtractedFact ;
cti:sourceDoc "reports/ta5142-report-2026.pdf" ;
cti:confidence 0.97 .
########################
# 第3层:SHACL 形状(质量门禁)
########################
cti:VulnerabilityShape a sh:NodeShape ;
sh:targetClass cti:Vulnerability ;
sh:property [ sh:path cti:cveId ; sh:minCount 1 ; sh:maxCount 1 ;
sh:pattern "^CVE-\\d{4}-\\d+$" ] ;
sh:property [ sh:path cti:affects ; sh:minCount 1 ; sh:class cti:Product ] ;
sh:property [ sh:path cti:hasSeverity ; sh:minCount 1 ; sh:maxCount 1 ;
sh:class cti:SeverityLevel ] .
cti:ThreatActorShape a sh:NodeShape ;
sh:targetClass cti:ThreatActor ;
sh:property [ sh:path cti:uses ; sh:minCount 1 ; sh:class cti:Malware ] ;
sh:property [ sh:path cti:exploits ; sh:minCount 1 ; sh:class cti:Vulnerability ] .
cti:MalwareShape a sh:NodeShape ;
sh:targetClass cti:Malware ;
sh:property [ sh:path cti:implements ; sh:minCount 1 ; sh:class cti:AttackPattern ] .
cti:ProductShape a sh:NodeShape ;
sh:targetClass cti:Product ;
sh:property [ sh:path cti:developedBy ; sh:minCount 1 ; sh:class cti:Organization ] .
########################
# 校验结论(假设)
########################
# 五条数据全部通过:CVE 两条有合法 cveId + affects PAN-OS + 各一个 severity;
# TA-5142 用了恶意软件、利用了漏洞;PAN-OS 有厂商;HAMMERTOSS 实现了 C2。
# 关键推理联动:
# ① Backdoor ⊑ Malware、MalwareFamily ⊑ Malware → 推理机推出 HAMMERTOSS a Malware,
# 从而满足 ThreatActorShape 里 uses sh:class Malware——先跑推理再跑 SHACL,模型与校验不打架。
# ② owl:inverseOf 让 exploits ⟷ exploitedBy 自动补全(TA-5142 exploits CVE ⟹ CVE exploitedBy TA-5142)。
# ③ 与 STIX 2.1 对齐:类对应 threat-actor / vulnerability / malware / tool /
# attack-pattern / identity 对象,cveId / severity / sourceDoc 字段一一对应,便于互通。
3.8 图谱:本体填实例 = 图谱
上面 3.2~3.6 从直觉模型画图、3.7 落成 OWL/RDF/SHACL 正式建模。把两者合一——用本体(Schema)约束 + 实例(ABox)填充,这张知识图谱就是“建成的大楼”:

(CVE-2024-3401 与 CVE-2024-3400 同构:TA-5142 –exploits–> CVE-2024-3401 –affects–> PAN-OS,省略避免重叠。)
这张图说明了什么:
-
本体 = 图纸:
ThreatActor / Vulnerability / Product / Malware / Organization / Platform / AttackPattern这些类、exploits/affects/uses/usesChannel/developedBy/targets这些属性,全部来自 OWL 定义——图里的每个节点带type:类标签、每条边就是对象属性,没有超纲。 -
实例 = 大楼:
TA-5142 / CVE-2024-3400 / PAN-OS…这些具体实体来自 RDF ABox,图里每个方框就是按图纸砌上去的一块。 -
SHACL = 门禁:图能进库,是因为通过了
VulnerabilityShape / ThreatActorShape / ProductShape校验(有 cveId、有 severity、有厂商、有影响面……)。 -
一句话:这张图 = OWL(Schema)+ RDF 实例(ABox)+ SHACL 校验 三者拼出来的知识图谱;与 Cypher 属性图是同一知识的两种表示(属性图侧重导入 Neo4j,这里侧重“本体约束下的成品图”)。
四、存储:示例数据如何落库
例子按“三层存储”分别落地,核心分工:关系库管事实、图库管关系、向量库管召回,图谱是“瘦视图”靠
sourceKey回源明细。
4.1 三类数据库对比
| 维度 | 关系数据库(PostgreSQL/MySQL) | 图数据库(Neo4j/Oxigraph/RDF) | 向量数据库(Milvus/pgvector) |
|---|---|---|---|
| 数据模型 | 表 + 行 + 外键 | 节点 + 关系(或 RDF 三元组) | 向量 + 元数据 |
| 擅长 | 事务、明细、报表、回源 | 多跳关系查询、路径推理 | 语义相似度召回 |
| 不擅长 | 深链多跳查询(多层 JOIN 很慢) | 事务密集、明细报表 | 精确关系、事务 |
| 在本例的角色 | 权威事实源(漏洞/厂商/情报明细) | 关系发现与推理 | 语义检索入口 |
| 存储形态 | 见 4.2 | 见 4.3 | 见 4.4 |
4.2 关系数据库存储(权威事实源)
TA-5142 情报在关系库的建表与插入:
-- 组织 / 产品 / 漏洞(被引用方先建,外键才成立)
CREATE TABLE organization (
id TEXT PRIMARY KEY,
name TEXT,
role TEXT
);
CREATE TABLE product (
id TEXT PRIMARY KEY, -- 'PAN-OS'
name TEXT,
vendor_id TEXT REFERENCES organization(id)
);
CREATE TABLE vulnerability (
id TEXT PRIMARY KEY, -- 'CVE-2024-3400'
severity TEXT,
product_id TEXT REFERENCES product(id)
);
-- 威胁行为体(瘦列,明细可加)
CREATE TABLE threat_actor (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
motivation TEXT,
sophistication TEXT
);
-- 关系表(多对多)
CREATE TABLE exploitation (
actor_id TEXT REFERENCES threat_actor(id),
vuln_id TEXT REFERENCES vulnerability(id),
PRIMARY KEY (actor_id, vuln_id)
);
INSERT INTO threat_actor VALUES ('ta5142', 'TA-5142', 'financial', 'high');
INSERT INTO product VALUES ('panos', 'PAN-OS', 'paloalto');
INSERT INTO organization VALUES ('paloalto', 'Palo Alto Networks', 'vendor');
INSERT INTO vulnerability VALUES ('CVE-2024-3400', 'critical', 'panos');
INSERT INTO exploitation VALUES ('ta5142', 'CVE-2024-3400');
角色:业务库唯一权威,图谱节点/边都带
sourceKey回指这里的行(如vulnerability.id='CVE-2024-3400'),关键数字读路径回源校验。
4.3 图数据库存储(关系发现)
用 3.6 的 Cypher 导入 Neo4j(节点 8 个、关系 8 条),或把 3.7 的 Turtle 导入 RDF 存储(Oxigraph/Jena)。查询示例:
// 多跳:"TA-5142 利用的漏洞影响的产品是谁开发的?"
MATCH (a:ThreatActor {name:'TA-5142'})-[:EXPLOITS]->(v:Vulnerability)-[:AFFECTS]->(p:Product)
<-[:DEVELOPS]-(o:Organization)
RETURN a.name, v.cveId, p.name, o.name
# 等价 SPARQL(RDF 存储)
PREFIX cti: <https://cti.example.org/>
SELECT ?vuln ?prod ?org WHERE {
?actor cti:exploits ?vuln .
?vuln cti:affects ?prod .
?prod cti:developedBy ?org .
}
角色:图谱当“关系发现器”不当“数据仓库”——只存支撑关系查询/推理的实体、关系、关键属性,明细靠
sourceKey回业务库。
4.4 向量数据库存储(语义召回入口)
把实体与事实向量化,作为检索入口(再走图谱多跳展开):
# 伪代码:实体/文档块 → embedding → Milvus
from pymilvus import Collection
col = Collection("cti_entities")
col.insert([
{"id": "ta5142", "vector": embed("TA-5142 financially motivated threat actor"),
"entity_type": "ThreatActor", "source_key": "ta5142"},
{"id": "cve3400", "vector": embed("CVE-2024-3400 critical vulnerability in PAN-OS"),
"entity_type": "Vulnerability", "source_key": "CVE-2024-3400"},
])
角色:向量库管“入口召回”、图谱管“关系展开”、业务库管“明细确认”——三路各司其职。问“TA-5142 相关情报”先用向量命中候选实体,再沿图谱多跳拿链路。
4.5 存储策略与选型
- 一致性靠“单向流”:业务库唯一权威 → 事件/CDC 触发图谱 upsert(幂等)→ 节点/边带
version + updated_at与sourceKey,旧三元组标“过期”而非物理删 → 定时对账 + 读路径回源校验(有界最终一致,不搞 ACID 双写)。 - 规模参考:研发类图谱一般百万~千万实体、几百万~千万边,单机图库足够;真到亿级再上分布式图库(NebulaGraph/TigerGraph)。
五、本体与知识图谱的应用场景
这一章回答“用在哪、解决什么问题”。先给 2 个典型应用场景,再承接第六章的工程化 SOP。
5.1 场景一:威胁情报关联分析
业务问题:威胁情报散落在报告、漏洞库、厂商公告里,分析师要回答跨实体多跳问题——“TA-5142 用的恶意软件经什么平台回连?”“它利用的漏洞影响的产品的厂商是谁?”纯文档检索(关键词/向量)答不了这种关系型问题。
本体+图谱解法:
威胁情报原文 ──两阶段抽取──► 三元组(TA-5142 exploits CVE-2024-3400)
│ │
▼ ▼
本体(ThreatActor/Vulnerability/Product…) ──约束──► 知识图谱(节点 + 边)
│ │
▼ ▼
SHACL 门禁(cveId 格式、影响面必填) 沿边多跳查询 + GraphRAG 回答
落地形态(对齐第一~四章):
- 本体:第三章威胁情报样例(6 类实体 + 6 种关系 + SHACL 约束),管“威胁情报的语言统一”——不同来源(报告/漏洞库/厂商)的同一实体(如
CVE-2024-3400)靠cveId对齐。 - 图谱:实体与关系实例化,支撑
MATCH ...-[:EXPLOITS]->()-[:AFFECTS]->()<-[:DEVELOPS]-() RETURN这类多跳查询。 - RAG 增强:GraphRAG 融合——向量召回候选实体 + 图谱沿边扩散给证据链,答案带
sourceDoc可溯源。
业务价值:把“分析师翻 N 份报告拼线索”变成“一个查询拿全攻击链”,缩短威胁狩猎时间、可审计可溯源。
示例:一次威胁情报问答的端到端演示
分析师问:“TA-5142 利用的漏洞影响的产品,是谁开发的?”
用户提问(自然语言)
│ NL→SPARQL / Text2Cypher 转换
▼
图谱查询:MATCH (a:ThreatActor {name:'TA-5142'})-[:EXPLOITS]->(v:Vulnerability)
-[:AFFECTS]->(p:Product)<-[:DEVELOPS]-(o:Organization)
RETURN v.cveId, p.name, o.name
│
▼
图谱命中路径(§3.8 图里的一条链):
TA-5142 --exploits--> CVE-2024-3400 --affects--> PAN-OS --developedBy--> Palo Alto Networks
│
▼
LLM 生成答案(带引用,可溯源):
"TA-5142 利用的 CVE-2024-3400(PAN-OS 关键漏洞)影响 PAN-OS,由 Palo Alto Networks 开发。
[证据] CVE-2024-3400 affects PAN-OS;PAN-OS developedBy Palo Alto Networks。
[溯源] reports/ta5142-report-2026.pdf → 第 3 节"
上图演示了场景一的完整闭环:自然语言 → 图谱多跳查询 → 路径命中 → 带引用的答案。回答“是谁”这类关系型问题,正是纯向量 RAG 做不到、本体+图谱补位的地方。
5.2 场景二:研发知识库问答
业务问题:研发过程资产(需求、方案、缺陷、评审意见)散落在多个系统、格式不一、语义不一。新人要查“这个缺陷对应哪个需求、影响哪个模块、上游是谁”,跨文档关系型问题,向量 RAG 抓不住。
本体+图谱解法:
研发过程建模:
客户需求 →(衍生)→ 产品需求 →(对应)→ 模块 →(支撑)→ 设计方案
→(覆盖)→ 测试用例 →(发现)→ 缺陷 →(归属)→ 模块
- 本体:把研发链路建模为类(需求/模块/方案/用例/缺陷/评审)+ 关系(衍生/对应/支撑/覆盖/发现/归属)+ 属性(优先级/状态/责任人/严重等级)+ 规则(“严重缺陷必须关联归属模块”→ 编码成 SHACL 校验)。
- 图谱:填充真实实例(某需求 → 某模块 → 某缺陷),支撑需求追溯链多跳查询,“上个季度严重缺陷集中在哪些模块”用 Text2Cypher 一句问出。
- RAG 增强:GraphRAG 检索方案时把周围子图塞进 Prompt,减少幻觉;答案带引用可回原文。
业务价值:把散落文档变成可检索、可推理、可溯源、可治理的领域知识库;需求追溯链(合规审计刚需)天然是图谱多跳主干。
两个场景的共同点:都是“关系型问题 + 跨系统数据 + 需溯源”,这正是纯文档检索做不到、本体+图谱 + RAG 能补位的场景。
六、本体建模的工程化 SOP
从“业务需求”到“可运行的知识图谱”,核心方法论:“先想清楚、先建地基、先验数据,再谈智能”,需求不清不启动;现有设施未盘点不选型;数据未清洗不入库;本体未经专家评审不抽取;质量不达标不验收。
6.1 总体流程设计:八阶段 + 五门禁
| 阶段 | 出口门禁(不通过则暂停,不得进入下一阶段) |
|---|---|
| P0 需求澄清 | — |
| P1 方案设计 | — |
| P2 技术路线与基础设施选型 | G1 路线 / 选型评审 |
| P3 领域本体构建 | G2 本体专家评审冻结 |
| P4 数据准备与接入 | G3 数据清洗质量核验(硬性,未达标禁止入库) |
| P5 图谱与智能构建 | G4 图谱质量抽测(F1≥0.8、溯源率≥90%) |
| P6 应用层与治理 | — |
| P7 验收移交与运营 | G5 全量验收 + 文档齐备 + 复盘 |
P0~P7 串行推进,五个门禁分别卡在 P2、P3、P4、P5、P7 的出口。其中 G3 数据清洗质量核验是硬门禁:未完成即暂停,绝不先入库(对应 §6.2 决策树最后一行)。
6.2 关键决策树
| 决策点 | 判断 | 决策 |
|---|---|---|
| 技术路线 | 关系/多跳推理是刚需吗? | 是 → GraphRAG 融合式;否 → RAG 优先 |
| 现有设施 | 已有图原生基础设施覆盖是否>60%? | 是 → 复用为基础设施层;否 → 评估自建 |
| 自建边界 | 设施不提供的是什么? | 领域本体、接入配置、产品体验 → 自建 |
| 存储 | 规模/并发/运维能力 | 嵌入式起步,配置预留 Neo4j+Qdrant |
| 抽取 | 数据量/算力 | 两阶段:规则 → LLM |
| 数据入库 | 清洗完成/人工兜底 | 未完成 → 暂停,绝不先入库 |
6.3 落地要点
- TBox / ABox 分离:TBox(术语盒:类/属性/约束/公理)与 ABox(断言盒:个体/事实断言)分开存储,本体文件存模式、实例文件存事实,Schema 版本演进不动数据。
- 先 Schema 后数据:本体经专家评审冻结(G2 门禁)再开始抽取灌数据,避免边建边抽导致 Schema 漂移。
- 与 LLM 的分工:抽取走“规则 → LLM”两阶段(见 §1.5),LLM 另负责起草本体;OWL/SHACL 负责约束与校验——LLM 输出必须落在 Schema 内、过 SHACL 门禁。抽取阶段规则先行是为了省算力,校验阶段规则兜底是为了保精度,两者互为补充。
- 溯源贯穿:每条抽取事实以
ExtractedFact包装,带sourceDoc+ 置信度(PROV-O),答案可回溯原文——企业级“可审计、可信任”的基石。
6.4 工具链参考
| 环节 | 工具 |
|---|---|
| 建模 | Protégé(可视化 OWL 编辑),或自建本体中心 API |
| 存储/推理 | Oxigraph / RDF4J / Jena(嵌入式起步),推理机 HermiT / Pellet / Jena OWL |
| 校验 | SHACL 引擎(Jena SHACL、pySHACL),输出报告对接质检流程 |
| 查询 | SPARQL(与 OWL/SHACL 同属 W3C 语义技术栈) |
| 图谱/向量 | Neo4j / NebulaGraph(图)、Milvus / Qdrant(向量) |