知识图谱
知识图谱
知识图谱是一种用图(Graph)结构来建模和存储现实世界中实体(Entity)、概念(Concept)及其之间复杂关系的知识库。它的核心目标是将互联网上非结构化的海量信息(如文本、图片)转化为结构化的知识,从而让机器能够像人类一样去理解和运用这些知识。
这个概念在2012年被谷歌(Google)正式提出并应用于其搜索引擎,极大地优化了搜索结果的质量和用户的体验,使得搜索不再是简单的关键词匹配,而是能够理解问题的意图并直接给出答案。
简单来说,知识图谱就是一张巨大的“知识之网”,网中的每个节点代表一个实体(比如一个人、一个地方、一部电影),而连接节点的边则代表它们之间的关系(比如“出生于”、“导演是”)。
核心构成
知识图谱的基本组成单位是“三元组(Triple)”,即“实体-关系-实体”或“实体-属性-属性值”的结构。
实体(Entity):指代现实世界中可识别、可区分的独立事物。在图中,实体表现为节点(Node)。
- 例如:“爱因斯坦”、“《相对论》”、“德国”都是实体。
关系(Relation):描述不同实体之间存在的某种联系。在图中,关系表现为连接节点的边(Edge)。
- 例如:“爱因斯坦”与“德国”之间的关系是“出生地”。“爱因斯坦”与“《相对论》”之间的关系是“提出者”。
属性(Attribute):描述单个实体所具有的内在特征。它是一种特殊的关系,其连接的不是另一个实体,而是一个具体的字面值(Literal)。
- 例如:“爱因斯坦”的“出生日期”属性是“1879年3月14日”。
- 属性也可以基于关系, 例如在 Neo4j 这样的图数据库中允许直接在边(Edge)上附加键值对(Key-Value)属性。这种方式称为属性图模型 (Property Graph)
知识图谱与传统数据库的区别
| 特性 | 传统关系型数据库 | 知识图谱(通常使用图数据库) |
|---|---|---|
| 数据模型 | 基于预先定义的、严格的表格(Table)结构 | 基于灵活的、无固定模式的图(Graph)结构 |
| 核心焦点 | 数据的存储和一致性 | 知识的关联、推理和发现 |
| 查询方式 | 通过SQL进行复杂的表连接(JOIN)操作,当关系复杂时性能急剧下降 | 直接通过图的遍历来查询关系,查询多层深度关系时性能极高 |
| 灵活性 | 结构死板,修改和扩展(Schema Change)成本高 | 结构灵活,可以随时轻松地添加新的实体、属性和关系 |
| 应用场景 | 适合处理结构化、事务性强的数据,如ERP、财务报表 | 适合处理高度互联、关系复杂的数据,如社交网络、金融风控 |
Neo4j 图数据库
Neo4j 是一个用 Java 开发的、开源的、高性能的原生图数据库管理系统(Graph Database Management System, GDBMS)。它秉承知识图谱的思想, 将数据以“图”的形式进行存储,而不是传统的表格(如MySQL)或键值对(如Redis)形式。
原生图数据库: Neo4j 从底层设计就是为了高效地存储和处理图结构。它的存储引擎直接面向节点和关系,使得在查询深度关联数据(例如“朋友的朋友的朋友”)时,性能远超传统数据库。
ACID兼容:Neo4j 是一个完全事务性的数据库,支持ACID(原子性、一致性、隔离性、持久性)特性,保证了数据的可靠性和业务的一致性,可以用于企业级的生产环境。
Neo4j 特别擅长处理数据之间存在复杂、多层、多变关系的应用场景。
- 社交网络:分析好友关系、社群发现。
- 金融风控:识别欺诈团伙、反洗钱、分析关联交易。
- 推荐引擎:提供实时、精准、可解释的个性化推荐。
- 知识图谱:构建和查询各领域(如医疗、电商、企业管理)的知识网络。
- 网络与IT运维:分析网络拓扑、依赖关系和故障影响。
Cypher:为图而生的查询语言
Cypher 是类SQL的用于 Neo4j 的声明式图查询语言,其设计哲学是让查询语句本身看起来就像一个图。它使用一种被称为“ASCII-Art”的语法,非常直观。 例如
1 | // 查找所有在《黑客帝国》中出演的演员 |
- () 用圆括号表示一个节点。
- [] 用方括号表示一个关系。
- –> 或 <– 表示关系的方向。
- : 后面跟着的是标签或关系类型。
- {} 用花括号表示属性。
- MATCH 是匹配图模式的关键字。
- RETURN 是指定返回结果的关键字。
py2neo:连接 Python 与 Neo4j 的桥梁
py2neo 是一个功能强大且维护活跃的 Python 客户端库(或称为“驱动”),专门用于与 Neo4j 数据库进行交互。它为 Python 开发者提供了一套简洁、优雅的API,使得在 Python 程序中操作 Neo4j 变得非常方便。
- 数据库连接管理:轻松建立、管理与 Neo4j 数据库的连接。
- 执行 Cypher 查询:可以直接在 Python 中执行原生的 Cypher 语句,并方便地处理返回的结果。
- 图数据操作:提供了丰富的 API 来以编程方式创建、更新、删除节点和关系。
- 对象图映射(Object-Graph Mapping, OGM):类似于传统数据库的 ORM(Object-Relational Mapping)。它允许你将图中的节点定义为 Python 的类(Class),将节点属性映射为类的属性,从而可以用更面向对象的方式来操作图数据,而不仅仅是写 Cypher 字符串。
- 与 Pandas, Jupyter 等数据科学生态集成:可以方便地将查询结果转换为 Pandas DataFrame,非常适合进行数据分析和可视化。
示例如下:
1 | from py2neo import Graph, Node, Relationship |