知识图谱
知识图谱(Knowledge Graph,简称 KG)是符号主义 AI 在 21 世纪的最大延续:用图结构存储海量事实(实体—关系—实体),支持快速查询和推理。它将传统专家系统中”规则 + 推理机”的思路扩展到了互联网规模,让机器不再依赖关键词匹配,而是真正”理解”概念之间的关系。其思想源头可追溯到逻辑推理与知识表示中的语义网络(Semantic Network,用节点和边表示概念及关系的网络结构)和框架表示。
与传统关系型数据库相比,知识图谱的核心优势在于灵活性和可推理性:关系型数据库需要预先定义表结构(Schema),跨表查询需要 JOIN 操作;而知识图谱天然以图的形式存储关系,沿边遍历就能发现”多跳”(multi-hop)的间接关联,这正是知识发现的关键能力。
知识图谱的核心数据结构是三元组(Triple):(主语, 谓语, 宾语),比如 (爱因斯坦, 提出, 相对论)。三元组中的三个角色也常被称为实体—关系—实体(Subject-Predicate-Object)。你可以把它想象成一张巨大的电子表格,每一行就是一条事实陈述:
| 主语 | 谓语 | 宾语 |
|---|---|---|
| 爱因斯坦 | 职业 | 物理学家 |
| 爱因斯坦 | 提出 | 相对论 |
| 相对论 | 属于 | 物理学 |
| 物理学 | 属于 | 自然科学 |
几亿条这样的三元组连在一起,就构成了一个知识网络。顺着”属于”这种关系层层追溯,就能回答”相对论属于什么大类?“这种问题。
从计算机科学的角度看,知识图谱本质上是一个有向标记图(Directed Labeled Graph):实体是节点,关系是有向边,关系的类型(谓语)就是边的标签。这种表示天然适合用邻接表存储,而图的遍历算法(BFS/DFS)就是查询和推理的基础。之所以选择三元组而非更复杂的数据结构,是因为三元组是最小但完整的”事实”单元——它同时回答了”谁”(主语)、“做了什么”(谓语)、“对谁/什么”(宾语),而更复杂的知识都可以拆解为多条三元组的组合。
RDF 三元组
Section titled “RDF 三元组”RDF(Resource Description Framework,资源描述框架,W3C 制定的知识表示标准格式)是知识图谱的标准数据模型,每条知识都是一个三元组。RDF 用 URI(Uniform Resource Identifier,统一资源标识符) 来唯一标识每个实体和关系,这样不同知识库之间就不会因为命名冲突而混淆——比如”苹果”到底是水果还是公司,在 RDF 中通过不同的 URI 来区分:
沿着关系链做传递推理(Transitive Reasoning):相对论属于物理学,物理学属于自然科学,所以相对论属于自然科学。这种推理在数据库查询中通过递归或 SPARQL 的属性路径(Property Path)语法实现,例如
属于+(加号表示一次或多次传递闭包)。
本体与推理规则
Section titled “本体与推理规则”仅有三元组还不够——要让机器”理解”关系的含义,需要**本体(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 查询知识图谱
Section titled “用 SPARQL 查询知识图谱”工业级知识图谱使用 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 等模型),使得 。这使得知识图谱可以用于链接预测(Link Prediction)——预测图中可能存在但尚未记录的关系,从而自动补全知识图谱。这也是知识图谱与深度学习结合的重要桥梁。
互联网产品
- Google 搜索知识面板:Google Knowledge Graph 包含数千亿条事实三元组,当你搜索”爱因斯坦”时右侧自动展示其生平、成就、相关人物的卡片——知识图谱让搜索引擎从”匹配关键词”升级为”理解实体及其关系”。
- 推荐系统:Netflix 的推荐引擎用知识图谱建模”用户—影片—演员—类型—标签”之间的关系,挖掘用户隐含兴趣链路(喜欢某导演→推荐其其他作品),提升推荐的多样性和解释性。
企业与垂直领域
- 企业知识图谱:大型企业(如阿里、腾讯)构建内部知识图谱打通产品、用户、供应商等数据孤岛,支持跨部门数据查询、组织架构分析和业务洞察。
- 金融风控关联分析:蚂蚁集团、彭博等金融平台用知识图谱建模公司、股东、担保、交易之间的关系网络,自动发现隐藏的利益输送链条和担保圈风险,用于反欺诈和反洗钱。
- 医疗知识图谱:IBM Watson Health、各类医学知识库(如 UMLS)将疾病、症状、药物、基因关联成图,支持临床辅助诊断、药物靶点发现和药物相互作用预警。
典型类库与工具
Section titled “典型类库与工具”| 类库 | 语言 | 说明 |
|---|---|---|
| rdflib | Python | 处理 RDF 三元组与 SPARQL 查询的标准库,知识图谱数据操作的基础工具 |
| Apache Jena | Java | 开源语义网框架,提供 RDF/OWL 数据存储、推理引擎与 SPARQL 端点 |
| Neo4j | Cypher/多语言 | 主流图数据库,以属性图存储实体与关系,支持图模式查询 |
| networkx | Python | 图分析与图算法库,适合中小规模知识图谱的路径查询与网络分析 |
| Wikidata / SPARQL 端点 | SPARQL | 维基百科结构化知识库,提供公开 SPARQL 查询接口,可直接在线查询数千亿条三元组 |
| Protégé | Java(桌面应用) | 斯坦福的本体编辑器,用 OWL 定义实体类型与关系类型(Schema/本体) |
| 术语 | 英文 | 解释 |
|---|---|---|
| 三元组 | Triple | 知识图谱的基本数据单元,由(主语, 谓语, 宾语)表示一条事实 |
| 资源描述框架 | RDF | W3C 制定的知识表示标准格式,用 URI 标识实体和关系,每条知识表示为三元组 |
| SPARQL | SPARQL Protocol and RDF Query Language | W3C 标准的 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)见与现代方法的关系。