Skip to content

知识图谱

知识图谱(Knowledge Graph,简称 KG)是符号主义 AI 在 21 世纪的最大延续:用图结构存储海量事实(实体—关系—实体),支持快速查询和推理。它将传统专家系统中”规则 + 推理机”的思路扩展到了互联网规模,让机器不再依赖关键词匹配,而是真正”理解”概念之间的关系。其思想源头可追溯到逻辑推理与知识表示中的语义网络(Semantic Network,用节点和边表示概念及关系的网络结构)和框架表示。

与传统关系型数据库相比,知识图谱的核心优势在于灵活性和可推理性:关系型数据库需要预先定义表结构(Schema),跨表查询需要 JOIN 操作;而知识图谱天然以图的形式存储关系,沿边遍历就能发现”多跳”(multi-hop)的间接关联,这正是知识发现的关键能力。

知识图谱的核心数据结构是三元组(Triple):(主语, 谓语, 宾语),比如 (爱因斯坦, 提出, 相对论)。三元组中的三个角色也常被称为实体—关系—实体(Subject-Predicate-Object)。你可以把它想象成一张巨大的电子表格,每一行就是一条事实陈述:

主语谓语宾语
爱因斯坦职业物理学家
爱因斯坦提出相对论
相对论属于物理学
物理学属于自然科学

几亿条这样的三元组连在一起,就构成了一个知识网络。顺着”属于”这种关系层层追溯,就能回答”相对论属于什么大类?“这种问题。

从计算机科学的角度看,知识图谱本质上是一个有向标记图(Directed Labeled Graph):实体是节点,关系是有向边,关系的类型(谓语)就是边的标签。这种表示天然适合用邻接表存储,而图的遍历算法(BFS/DFS)就是查询和推理的基础。之所以选择三元组而非更复杂的数据结构,是因为三元组是最小但完整的”事实”单元——它同时回答了”谁”(主语)、“做了什么”(谓语)、“对谁/什么”(宾语),而更复杂的知识都可以拆解为多条三元组的组合。

RDF(Resource Description Framework,资源描述框架,W3C 制定的知识表示标准格式)是知识图谱的标准数据模型,每条知识都是一个三元组。RDF 用 URI(Uniform Resource Identifier,统一资源标识符) 来唯一标识每个实体和关系,这样不同知识库之间就不会因为命名冲突而混淆——比如”苹果”到底是水果还是公司,在 RDF 中通过不同的 URI 来区分:

沿着关系链做传递推理(Transitive Reasoning):相对论属于物理学,物理学属于自然科学,所以相对论属于自然科学。这种推理在数据库查询中通过递归或 SPARQL 的属性路径(Property Path)语法实现,例如 属于+(加号表示一次或多次传递闭包)。

仅有三元组还不够——要让机器”理解”关系的含义,需要**本体(Ontology,对领域中实体类型、属性和关系的形式化定义)**来声明规则。例如,声明”导师”关系是传递的(A 是 B 的导师,B 是 C 的导师,则 A 也是 C 的导师),声明”人”是”动物”的子类(subClassOf),推理引擎就能自动推导出大量隐含事实。

W3C 的 OWL(Web Ontology Language,网络本体语言) 在 RDF 之上增加了丰富的表达能力,支持类层次、属性约束、基数限制等。基于 OWL 本体的推理使用**描述逻辑(Description Logic,一阶谓词逻辑的可判定子集,用概念和角色构造符表达知识)**作为理论基础,保证了推理的可判定性(即推理过程一定能在有限时间内终止并给出确定答案)。常见的推理任务包括:

  • 一致性检查(Consistency Checking):检测本体中是否存在逻辑矛盾(如某实体同时是”人”和”非生物”,违反了互斥约束)。
  • 类分类(Classification):根据定义自动计算类之间的层次关系(subClassOf)。
  • 实例检查(Instance Checking):推导某个实体隐含的类型归属。

这些推理任务在算法层面通常被转化为可满足性问题(SAT/Satisfiability),使用 Tableau 算法(一种基于展开和冲突检测的决策过程)或现代 SAT 求解器来完成。

动手实践:用 Python 构建知识图谱

Section titled “动手实践:用 Python 构建知识图谱”

不需要图数据库,用集合就能构建和查询一个知识图谱:

# 知识图谱:用三元组集合存储事实
# 每个三元组 (主语, 谓语, 宾语) 代表一条事实陈述
kg = {
("爱因斯坦", "提出", "相对论"),
("爱因斯坦", "职业", "物理学家"),
("相对论", "属于", "物理学"),
("物理学", "属于", "自然科学"),
("牛顿", "提出", "万有引力"),
("牛顿", "职业", "物理学家"),
}
def query(kg, entity, relation=None):
"""
查询实体的所有关系(可按关系类型过滤)。
本质上是对所有三元组做线性扫描,复杂度 O(n)。
工业级系统会用哈希索引或邻接表来加速到 O(1) 或 O(度数)。
"""
return [(p, o) for (s, p, o) in kg
if s == entity and (relation is None or p == relation)]
def transitive_query(kg, entity, relation):
"""
传递查询:沿关系链递归查找,相当于计算图的传递闭包。
算法本质是深度优先搜索(DFS),visited 集合防止环路导致的无限递归。
"""
found, visited = [], set()
def _walk(e):
for (s, p, o) in kg:
if s == e and p == relation and o not in visited:
visited.add(o); found.append(o); _walk(o) # 递归遍历下一跳
_walk(entity)
return found
# 测试
print(query(kg, "爱因斯坦")) # [('提出', '相对论'), ('职业', '物理学家')]
print(transitive_query(kg, "相对论", "属于")) # ['物理学', '自然科学']

工业级知识图谱使用 SPARQL(SPARQL Protocol and RDF Query Language,W3C 标准的 RDF 查询语言) 来查询。SPARQL 的语法类似 SQL,但面向的是图结构而非表。下面是一个查询”所有物理学家的成就”的 SPARQL 例子:

PREFIX ex: <http://example.org/>
SELECT ?person ?achievement WHERE {
?person ex:职业 "物理学家" . # 匹配职业为物理学家的人
?person ex:提出 ?achievement . # 匹配该人提出的理论
}
# 结果会返回: 爱因斯坦→相对论, 牛顿→万有引力

SPARQL 的核心是图模式匹配(Graph Pattern Matching):查询中的每个三元组模式就是一个子图模板,引擎在大图中找到所有匹配的子图并返回绑定变量(以 ? 开头的标识符)。?person 和 ?achievement 是变量,引擎会把所有满足条件的赋值都找出来。

工业级知识图谱(Google Knowledge Graph、Wikidata)使用图数据库(Neo4j)或三元组存储(Triple Store,如 Apache Jena、Virtuoso),支持 SPARQL 查询语言,规模达数千亿条三元组。底层通常采用PRESTO 模型(六重索引:SPO、SOP、PSO、POS、OSP、OPS,即对三元组的三个位置做全排列索引),保证任意查询模式都能命中索引。

  • 知识图谱的构建方式经历了三代演进:第一代是手工编码(Cyc 花了几十年人工编码数百万条常识,代价极高且难以扩展);第二代是半自动信息抽取(从 Wikipedia、网页自动抽取实体和关系,配合人工审核);第三代(2023 年至今)是 LLM 驱动构建——大语言模型让抽取过程变得更准更便宜,可以直接从非结构化文本中抽取实体、关系和属性,甚至自动生成本体 Schema,大幅降低了知识图谱的构建门槛。
  • 知识图谱 vs 向量数据库:知识图谱存的是精确的结构化关系(“A 是 B 的导师”),擅长多跳推理和精确查询;向量数据库(Vector Database)存的是模糊的语义相似度(文本段落的 Embedding 向量),擅长模糊匹配和相似度检索。两者互补:知识图谱提供精度和可解释性,向量数据库提供召回率和灵活性。RAG 系统越来越倾向混合使用(GraphRAG,详见下文)。
  • Schema 设计很重要:好的知识图谱需要定义清晰的实体类型和关系类型(本体/Schema),否则同一概念会有多种表示(“爱因斯坦”vs”Albert Einstein”vs”Einstein”),导致查询遗漏。工业界常用 **实体对齐(Entity Alignment,将不同来源指向同一真实世界实体的记录合并)和实体消歧(Entity Disambiguation,根据上下文判断实体指代的具体含义)**来解决这个问题。
  • 知识图谱嵌入(Knowledge Graph Embedding):将实体和关系映射到低维向量空间(如 TransE、RotatE 等模型),使得 向量(主语)+向量(关系)≈向量(宾语)\text{向量}(\text{主语}) + \text{向量}(\text{关系}) \approx \text{向量}(\text{宾语})。这使得知识图谱可以用于链接预测(Link Prediction)——预测图中可能存在但尚未记录的关系,从而自动补全知识图谱。这也是知识图谱与深度学习结合的重要桥梁。

互联网产品

  • Google 搜索知识面板:Google Knowledge Graph 包含数千亿条事实三元组,当你搜索”爱因斯坦”时右侧自动展示其生平、成就、相关人物的卡片——知识图谱让搜索引擎从”匹配关键词”升级为”理解实体及其关系”。
  • 推荐系统:Netflix 的推荐引擎用知识图谱建模”用户—影片—演员—类型—标签”之间的关系,挖掘用户隐含兴趣链路(喜欢某导演→推荐其其他作品),提升推荐的多样性和解释性。

企业与垂直领域

  • 企业知识图谱:大型企业(如阿里、腾讯)构建内部知识图谱打通产品、用户、供应商等数据孤岛,支持跨部门数据查询、组织架构分析和业务洞察。
  • 金融风控关联分析:蚂蚁集团、彭博等金融平台用知识图谱建模公司、股东、担保、交易之间的关系网络,自动发现隐藏的利益输送链条和担保圈风险,用于反欺诈和反洗钱。
  • 医疗知识图谱:IBM Watson Health、各类医学知识库(如 UMLS)将疾病、症状、药物、基因关联成图,支持临床辅助诊断、药物靶点发现和药物相互作用预警。
类库语言说明
rdflibPython处理 RDF 三元组与 SPARQL 查询的标准库,知识图谱数据操作的基础工具
Apache JenaJava开源语义网框架,提供 RDF/OWL 数据存储、推理引擎与 SPARQL 端点
Neo4jCypher/多语言主流图数据库,以属性图存储实体与关系,支持图模式查询
networkxPython图分析与图算法库,适合中小规模知识图谱的路径查询与网络分析
Wikidata / SPARQL 端点SPARQL维基百科结构化知识库,提供公开 SPARQL 查询接口,可直接在线查询数千亿条三元组
ProtégéJava(桌面应用)斯坦福的本体编辑器,用 OWL 定义实体类型与关系类型(Schema/本体)
术语英文解释
三元组Triple知识图谱的基本数据单元,由(主语, 谓语, 宾语)表示一条事实
资源描述框架RDFW3C 制定的知识表示标准格式,用 URI 标识实体和关系,每条知识表示为三元组
SPARQLSPARQL Protocol and RDF Query LanguageW3C 标准的 RDF 知识图谱查询语言,类似 SQL 但面向图结构
本体Ontology对领域中实体类型、属性和关系的形式化定义,为知识图谱提供 Schema 约束
实体链接Entity Linking将文本中提到的实体映射到知识图谱中对应条目的过程
传递推理Transitive Reasoning沿关系链递归推导间接关系,如”A 属于 B,B 属于 C”推出”A 属于 C”
知识抽取Knowledge Extraction从非结构化文本(如 Wikipedia)中自动提取实体、关系和属性生成三元组的技术
  • 手工知识库:Cyc(1984,Lenat,手工编码常识本体,耗资巨大、争议至今);WordNet(1985,Miller,Princeton,英语词汇语义网络)。
  • 语义网与链接数据:语义网(Berners-Lee 1998/2001,RDF/OWL 标准)→ DBpedia(2007)、Freebase(2007)、Wikidata(2012)。
  • 工业知识图谱:Google Knowledge Graph(2012-05)基于 Freebase、Wikipedia 等构建,使”知识图谱”一词流行。
  • 知识图谱今天与 LLM 的结合(GraphRAG)见与现代方法的关系。