知识图谱

ZaynPei Lv6

知识图谱

知识图谱是一种用图(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
2
3
// 查找所有在《黑客帝国》中出演的演员
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie {title: '黑客帝国'})
RETURN actor.name, movie.title

  • () 用圆括号表示一个节点。
  • [] 用方括号表示一个关系。
  • –> 或 <– 表示关系的方向。
  • : 后面跟着的是标签或关系类型。
  • {} 用花括号表示属性。
  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from py2neo import Graph, Node, Relationship

# 1. 连接到 Neo4j 数据库
# 默认情况下,Neo4j 启动在 bolt://localhost:7687,用户名为 neo4j
# 请将 "your_password" 替换为你的 Neo4j 密码
try:
graph = Graph("bolt://localhost:7687", auth=("neo4j", "your_password"))
print("成功连接到 Neo4j 数据库!")
except Exception as e:
print(f"连接失败: {e}")
exit()

# 2. 清理数据库(可选,用于演示)
print("清理数据库...")
graph.delete_all()

# 3. 创建节点 (Node)
# 创建两个 Person 节点
alice = Node("Person", name="Alice", age=30)
bob = Node("Person", name="Bob", age=32)

# 创建一个 Company 节点
google = Node("Company", name="Google")

# 4. 创建关系 (Relationship)
# 关系可以有自己的属性
alice_knows_bob = Relationship(alice, "KNOWS", bob, since=2015)
bob_works_for_google = Relationship(bob, "WORKS_FOR", google, position="Engineer")

# 5. 将创建的节点和关系写入数据库
# graph.create() 是原子操作,会一次性创建所有内容
print("正在创建节点和关系...")
graph.create(alice_knows_bob)
graph.create(bob_works_for_google)
print("创建完成!")


# 6. 执行 Cypher 查询
print("\n--- 开始查询 ---")

# 查询1: 找到所有年龄大于 31 岁的人
query1 = "MATCH (p:Person) WHERE p.age > 31 RETURN p.name, p.age"
print(f"执行查询: {query1}")
results1 = graph.run(query1)

for record in results1:
print(f" 找到的人: {record['p.name']}, 年龄: {record['p.age']}")

# 查询2: 找到所有为 Google 工作的人
query2 = "MATCH (p:Person)-[:WORKS_FOR]->(c:Company {name: 'Google'}) RETURN p.name, c.name"
print(f"\n执行查询: {query2}")
results2 = graph.run(query2)

for record in results2:
print(f" {record['p.name']}{record['c.name']} 工作。")