知识图谱详解:从图结构、关系建模到查询与应用

知识图谱详解:从图结构、关系建模到查询与应用

知识图谱(Knowledge Graph)是一种以**实体(Entity)和实体之间的关系(Relation)**为核心组织知识的数据结构。与传统数据库主要描述"数据是什么"不同,知识图谱更加关注"数据之间有什么关系"。例如,在一个安全领域知识图谱中,可以表示:

复制代码
CVE-2025-1234
      │
   HAS_CWE
      ↓
   CWE-89
      │
    TYPE
      ↓
SQL Injection
      │
  FIXED_BY
      ↓
Parameterized Query

通过这种方式,原本分散在不同文档中的信息被组织成一个可以计算、查询和推理的关系网络。知识图谱最初主要应用于搜索、推荐和知识管理,如今也经常与 RAG、LLM、Agent 等技术结合,用于提供结构化知识和关系推理能力。

一、知识图谱的核心思想

知识图谱最重要的思想其实非常简单:

把现实世界中的对象表示成节点,把对象之间的关系表示成边。

例如有三个实体:

复制代码
CVE-2025-1234
CWE-89
SQL Injection

以及两个关系:

复制代码
CVE-2025-1234 ──HAS_CWE──> CWE-89
CWE-89 ──DESCRIBES──> SQL Injection

这时就形成了一个最基本的图。

在数学和计算机科学中,一个图通常可以表示为:

G=(V,E)

其中 V 表示节点集合,E 表示边集合。对于知识图谱来说,可以进一步为节点和边增加属性,从而表达更加丰富的知识。

例如:

复制代码
Node:
{
    id: "CWE-89",
    type: "CWE",
    name: "SQL Injection"
}

Edge:
{
    source: "CVE-2025-1234",
    target: "CWE-89",
    type: "HAS_CWE"
}

因此,知识图谱本质上可以看成是一个**带语义的属性图(Property Graph)**或者其他形式的知识图表示。

二、知识图谱中的三个核心元素

最常见的知识表示方式可以概括为:

复制代码
实体 + 关系 + 属性

1. 实体

实体代表现实世界中的对象,例如:

复制代码
CVE
CWE
漏洞
公司
产品
人物
地点
论文
疾病
药物

例如:

复制代码
CVE-2025-1234
CWE-89
Django
SQL Injection

这些都可以作为实体。

2. 关系

关系用于描述实体之间的连接,例如:

复制代码
HAS_CWE
AFFECTS
EXPLOITS
FIXED_BY
CREATED_BY
LOCATED_IN
RELATED_TO

例如:

复制代码
CVE-2025-1234 ──HAS_CWE──> CWE-89
CVE-2025-1234 ──AFFECTS──> Django

3. 属性

实体和关系还可以携带属性。

例如一个 CVE 节点:

复制代码
{
  "id": "CVE-2025-1234",
  "type": "CVE",
  "severity": "high",
  "published_at": "2025-01-10"
}

这样就不仅知道"它是什么",还知道"它有哪些特征"。

所以一个更完整的图谱结构可以表示为:

复制代码
              属性
               ↓
          ┌──────────┐
          │   CVE    │
          │ id=1234  │
          │ severity │
          └────┬─────┘
               │
            HAS_CWE
               │
               ↓
          ┌──────────┐
          │   CWE    │
          │   89     │
          └──────────┘

三、为什么知识图谱和传统数据库不同

传统关系型数据库通常以表、行、列的形式组织数据。

例如:

复制代码
CVE 表

id               cwe        severity
CVE-2025-1234    CWE-89     High

这种结构对于结构化业务数据非常有效,但当关系变得复杂时,需要通过 JOIN 操作将多个表连接起来。

例如:

复制代码
CVE
 ↓
CWE
 ↓
Vulnerability
 ↓
Product
 ↓
Remediation

如果这些信息分别存在不同的表中,就需要多次 JOIN。

知识图谱则直接把关系表示为图中的边:

复制代码
CVE
 ↓ HAS_CWE
CWE
 ↓ DESCRIBES
Vulnerability
 ↓ AFFECTS
Product
 ↓ FIXED_BY
Remediation

因此,对于关系密集型的数据,图结构通常更加直观。

但这并不意味着知识图谱可以完全替代关系型数据库。两者解决的问题不同:

复制代码
关系型数据库
→ 强调结构化数据、事务、一致性

知识图谱
→ 强调实体关系、关系查询和图上的分析

实际系统中两者通常是协同工作的。

四、知识图谱是怎么构建出来的

一个完整的知识图谱通常不是直接手工创建,而是经过一个知识抽取与构建流程:

复制代码
原始数据
   ↓
数据清洗
   ↓
实体抽取
   ↓
关系抽取
   ↓
实体对齐
   ↓
属性补充
   ↓
图谱构建
   ↓
图数据库 / 图计算系统

1. 数据来源

知识图谱的数据来源非常广泛,例如:

复制代码
数据库
API
网页
PDF
Markdown
日志
业务系统
大语言模型
人工标注

以安全知识图谱为例,可以从 CVE、CWE、厂商安全公告、漏洞扫描报告等来源获得数据。

2. 实体抽取

从原始文本中识别出有价值的实体。

例如:

复制代码
"CVE-2025-1234 属于 CWE-89,
影响 Django 5.0,并可通过参数化查询修复。"

可以抽取:

复制代码
CVE-2025-1234
CWE-89
Django 5.0
参数化查询

3. 关系抽取

继续识别实体之间的关系:

复制代码
CVE-2025-1234
    ↓ 属于
CWE-89

CVE-2025-1234
    ↓ 影响
Django 5.0

CVE-2025-1234
    ↓ 修复方式
参数化查询

4. 实体对齐

不同数据源可能对同一个实体使用不同名称。

例如:

复制代码
SQL Injection
SQLi
SQL 注入
CWE-89

系统需要判断哪些描述实际上指的是同一个概念,并统一实体 ID。

否则图中就会出现大量重复节点。

5. 图谱写入

最后,把实体和关系写入图数据库或者图结构。

例如:

复制代码
(CVE-2025-1234)-[:HAS_CWE]->(CWE-89)
(CVE-2025-1234)-[:AFFECTS]->(Django)
(CWE-89)-[:FIXED_BY]->(Parameterized Query)

至此,一张知识图谱基本形成。

五、知识图谱中的实体对齐为什么重要

实体对齐(Entity Resolution / Entity Linking)是知识图谱构建中的一个重要问题。

例如来自不同数据源的数据可能分别写成:

复制代码
Microsoft Windows 11
Windows 11
Win11

如果不进行实体对齐,图谱可能认为它们是三个不同实体:

复制代码
Windows 11
Windows 11
Win11

最终导致知识分散。

正确的处理应该是:

复制代码
Windows 11
↑
├── Windows 11
├── Win11
└── Microsoft Windows 11

通过统一实体 ID,多个数据源中的信息才能汇聚到同一个节点上。

六、知识图谱如何查询

知识图谱的一个核心优势是能够进行关系查询

不同图数据库使用的查询语言不同。以 Neo4j 为例,可以使用 Cypher。

例如:

复制代码
MATCH (cve:CVE {id: "CVE-2025-1234"})
      -[:HAS_CWE]->
      (cwe:CWE)
RETURN cve, cwe

表示:

查找 CVE-2025-1234 对应的 CWE。

如果希望继续查找该 CWE 对应的漏洞类型和修复方案,可以进行多跳查询:

复制代码
MATCH (cve:CVE {id: "CVE-2025-1234"})
      -[:HAS_CWE]->(cwe:CWE)
      -[:DESCRIBES]->(v:Vulnerability)
      -[:FIXED_BY]->(r:Remediation)
RETURN cve, cwe, v, r

这就是知识图谱非常重要的能力:

从一个实体沿着关系逐步访问相关实体。

这种查询方式通常被称为图遍历(Graph Traversal)

七、什么是多跳查询

假设有:

复制代码
CVE
 ↓
CWE
 ↓
攻击方式
 ↓
影响产品
 ↓
修复方式

如果只查询:

复制代码
CVE → CWE

就是一跳。

如果查询:

复制代码
CVE → CWE → 攻击方式

就是两跳。

如果继续:

复制代码
CVE → CWE → 攻击方式 → Product → Remediation

则属于多跳查询。

多跳查询是知识图谱区别于普通关键词搜索的重要能力之一,因为它关注的不只是"有哪些相关文本",还关注:

实体之间是怎样连接起来的。

八、知识图谱中的推理

知识图谱不仅可以查询已有关系,还可以在一定条件下进行推理。

例如已有:

复制代码
A ──IS_A──> B
B ──AFFECTS──> C

通过规则可以推导出:

复制代码
A ──AFFECTS──> C

当然,现实中的知识图谱推理更加复杂,可能涉及:

复制代码
规则推理
路径推理
本体推理
概率推理
图神经网络
LLM 推理

需要注意的是,图数据库的查询和知识推理并不是同一个概念。图数据库可以很高效地执行关系查询,但复杂的知识推理通常需要额外的规则引擎、推理框架或者机器学习模型。

九、知识图谱和 RAG 有什么区别

知识图谱和 RAG 经常一起出现,但两者不是同一种技术。

传统 RAG 通常是:

复制代码
文档
 ↓
Chunk
 ↓
Embedding
 ↓
Vector Database
 ↓
Similarity Search
 ↓
LLM

它擅长:

找到和用户问题语义相似的文本。

知识图谱则更加关注:

复制代码
Entity
 ↓
Relation
 ↓
Entity

它擅长:

找到实体之间明确存在的关系。

因此两者可以互补。

例如用户问:

"CVE-2025-1234 属于什么 CWE?历史上有没有类似的漏洞?有哪些修复方法?"

向量检索可以找到:

复制代码
相关漏洞描述
历史文档
修复文档

知识图谱则可以提供:

复制代码
CVE → CWE
CVE → Product
CWE → Vulnerability Type
Vulnerability → Remediation

最终可以组成:

复制代码
用户问题
   ↓
┌───────────────┐
│               │
Vector Search   Graph Search
│               │
语义相关文档    关系相关知识
│               │
└───────┬───────┘
        ↓
      Context
        ↓
       LLM

这种架构经常被称为Graph RAG或者知识图谱增强的 RAG。

十、知识图谱和向量数据库的区别

向量数据库和知识图谱解决的是两种不同类型的检索问题。

例如用户查询:

复制代码
"如何防止用户输入导致数据库查询被恶意利用?"

向量检索可能找到:

复制代码
SQL Injection prevention
Parameterized query
Input validation

因为它们在语义上比较接近。

而知识图谱更适合回答:

复制代码
CWE-89
    ↓
属于
    ↓
SQL Injection
    ↓
影响
    ↓
某产品
    ↓
修复
    ↓
Parameterized Query

因此可以简单理解为:

复制代码
向量数据库
→ "什么内容和我的问题相似?"

知识图谱
→ "这些实体之间有什么关系?"

十一、知识图谱常见的实现方式

知识图谱不一定必须使用专业图数据库。

NetworkX

NetworkX 是 Python 中非常常用的图计算库,可以直接在内存中维护节点和边。

例如:

复制代码
import networkx as nx

G = nx.DiGraph()

G.add_node(
    "CVE-2025-1234",
    type="CVE"
)

G.add_node(
    "CWE-89",
    type="CWE"
)

G.add_edge(
    "CVE-2025-1234",
    "CWE-89",
    relation="HAS_CWE"
)

NetworkX 非常适合:

复制代码
原型开发
图算法
实验
小规模知识图谱
知识图谱可视化

但它本质上是 Python 内存中的图结构,并不是专业图数据库。随着数据规模增加,持久化、并发访问以及复杂查询能力都会成为限制。

Neo4j

Neo4j 是比较经典的图数据库,支持节点、关系、属性以及 Cypher 查询语言。

适合:

复制代码
持久化
复杂图查询
多跳关系查询
生产应用

NebulaGraph 等图数据库

对于更大规模的图数据,还可以选择分布式图数据库,例如 NebulaGraph 等。它们更加关注大规模图数据的存储和查询。

因此可以简单区分:

复制代码
NetworkX
→ Python 图计算库

Neo4j
→ 图数据库

NebulaGraph
→ 分布式图数据库

十二、知识图谱的可视化

知识图谱天然适合可视化。

例如:

复制代码
              CVE
             /   \
         HAS_CWE  AFFECTS
           /       \
         CWE      Product
          |
       DESCRIBES
          |
    Vulnerability
          |
       FIXED_BY
          |
      Remediation

通过可视化,可以直观观察:

复制代码
哪些节点连接最多
哪些实体是核心节点
实体之间有哪些关系
是否存在异常关系
某个实体和哪些实体相关

NetworkX 可以结合 Matplotlib 进行基础图谱可视化,而 Gephi、Cytoscape 等工具更适合交互式和大规模图谱分析。

需要注意的是,图谱可视化和图谱存储是两个不同的问题。一个系统可以使用 Neo4j 存储图数据,再使用其他工具进行可视化。

十三、知识图谱适合什么场景

知识图谱尤其适合以下类型的问题:

搜索与推荐

例如:

复制代码
用户
 ↓
兴趣
 ↓
内容
 ↓
作者

通过图关系可以实现更复杂的推荐。

风险分析

例如:

复制代码
用户
 ↓
账号
 ↓
设备
 ↓
IP
 ↓
交易

可以利用关系发现异常行为。

医疗知识

例如:

复制代码
疾病
 ↓
症状
 ↓
药物
 ↓
禁忌

用于辅助检索和知识管理。

网络安全

例如:

复制代码
CVE
 ↓
CWE
 ↓
漏洞类型
 ↓
攻击方式
 ↓
受影响产品
 ↓
修复方案

非常适合构建安全知识库。

企业知识管理

例如:

复制代码
公司
 ↓
部门
 ↓
员工
 ↓
项目
 ↓
文档

可以帮助企业建立统一知识网络。

十四、知识图谱并不是"把所有数据画成一张图"

这是实际开发中非常容易产生的误解。

知识图谱真正重要的是:

复制代码
实体定义
+
关系定义
+
数据质量
+
实体对齐
+
查询能力
+
推理能力

图形只是知识图谱的一种展示方式。

例如下面这种漂亮的网络图:

复制代码
●──●──●
 \ │ ╱
  ●─●
 / │ \
●──●──●

本身并不能说明它就是一个知识图谱。只有当节点具有明确语义、边表示具有业务含义的关系,并且这些关系能够被查询和利用时,才真正具有知识图谱的价值。

十五、知识图谱、图数据库、RAG 三者的关系

最后可以把这几个容易混淆的概念放在一起理解。

复制代码
                 知识图谱
                    │
           表示实体和实体关系
                    │
          ┌─────────┴─────────┐
          ↓                   ↓
      图数据库              图计算
          │                   │
       Neo4j              NetworkX
          │
          ↓
       持久化存储

而 RAG 是另外一层:

复制代码
                RAG
                 │
       ┌─────────┴─────────┐
       ↓                   ↓
   Vector Search       Graph Search
       ↓                   ↓
     Qdrant          Knowledge Graph
       └─────────┬─────────┘
                 ↓
                LLM

所以:

知识图谱是一种知识组织方式,图数据库是一种存储和查询图数据的技术,NetworkX 是图计算库,而 RAG 是一种让模型利用外部知识生成答案的方法。

它们可以独立使用,也可以组合起来形成更加复杂的知识增强系统。

相关推荐
tryCbest1 小时前
搭建企业知识库之Milvus 向量数据库
数据库·milvus
czhc11400756631 小时前
2026-08-24 博客:几个让你少踩坑的概念
数据库
ACP广源盛139246256732 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 Serdes 长距离视频传输芯片 GSV5800 在私有化 AI 服务中的价值与应用场景
大数据·数据库·人工智能·嵌入式硬件·矩阵·开源·音视频
oradh2 小时前
Oracle RMAN备份脚本、RMAN还原恢复测试、RMAN常用语句
数据库·oracle·rman备份脚本·rman还原恢复测试·rman常用语句
汽车仪器仪表相关领域2 小时前
ZDT‑I伺服电机测试系统:四象限动态加载
大数据·数据库·分布式·功能测试·汽车·压力测试·可用性测试
云贝教育-郑老师3 小时前
Oracle 块清除(Block Cleanout):commit 之后,数据块里的“战场“谁来打扫?
数据库·学习·oracle
gs801403 小时前
Java 响应式编程详解:从 Flux、Mono 到 Spring WebFlux 技术生态
数据库·oracle
一只旭宝3 小时前
预约系统版本2(pyhton+flask可视化版本)
服务器·数据库·c++·笔记·python·flask
__zRainy__3 小时前
Node系列 · ORM:mysql 驱动程序
数据库·后端·mysql·node.js·orm