【图数据库与知识图谱入门】3.1 定义:什么是知识图谱?(完善版)

内容分享3小时前发布
1 0 0

文章目录

Python Py2neo 构建知识图谱:从定义到实战3.1 定义:什么是知识图谱?(完善版)一、知识图谱的核心定义二、知识图谱的核心构成要素三、知识图谱的核心特征四、实战代码:基于Python+Py2neo构建简易知识图谱实战场景前置准备实战步骤步骤1:连接Neo4j数据库步骤2:创建实体(带属性)步骤3:创建实体间的关系(带属性可选)步骤4:查询知识图谱数据步骤5:可视化查看知识图谱步骤6:可选:更新和删除知识图谱数据

五、实战效果说明六、知识图谱的典型应用场景总结

Python Py2neo 构建知识图谱:从定义到实战

3.1 定义:什么是知识图谱?(完善版)

一、知识图谱的核心定义

知识图谱(Knowledge Graph)是一种以结构化三元组(实体-关系-实体)为核心载体,用于描述现实世界中客观存在的事物(实体)及其之间关联关系(关系),并通过属性为实体和关系赋予补充信息的语义网络。它本质上是一种语义化的知识表示框架,能够将分散的、非结构化的信息转化为机器可理解的结构化知识,从而支撑智能检索、智能问答、决策推理等下一代智能数据应用。从技术本质来看,知识图谱并非单一技术,而是融合了
自然语言处理、图论、数据库、机器学习等多领域技术的综合体系
,其核心价值在于揭示数据背后的语义关联,实现从“数据”到“知识”的升华,让机器具备一定的认知能力

二、知识图谱的核心构成要素

知识图谱的核心组成单元是「三元组」,同时包含实体、关系、属性三大核心要素,三者共同构成知识图谱的语义骨架:

实体(Entity):现实世界中的具体事物或抽象概念,是知识图谱的基本节点。例如“李白”(人物实体)、“《静夜思》”(作品实体)、“北京市”(地理实体)、“人工智能”(概念实体)。
关系(Relation):用于连接两个实体,描述实体之间的语义关联,是知识图谱的边。例如“李白-创作-《静夜思》”中的“创作”、“北京市-隶属-中国”中的“隶属”、“张三-朋友-李四”中的“朋友”。
属性(Attribute):用于补充描述实体或关系的特征信息,通常以“键-值对”形式存在。例如实体“李白”的属性“出生日期-701年”、“籍贯-陇西成纪”;实体“《静夜思》”的属性“体裁-五言绝句”、“创作年代-盛唐”;关系“创作”的属性“创作地点-扬州”。

此外,复杂知识图谱还包含「实体类别(Category)」(如“李白”属于“诗人”类别)、「规则(Rule)」(如“父亲的父亲是祖父”)等补充要素,用于提升知识的组织性和推理能力。

三、知识图谱的核心特征

结构化表示:以三元组为基本单位,摆脱了传统非结构化文本的模糊性,使知识具备明确的语义边界,机器可直接解析和处理。
语义化关联:强调实体之间的语义逻辑关系,而非简单的字符串匹配,能够捕捉数据背后的深层含义(如“苹果”既可以是水果实体,也可以是科技公司实体,知识图谱可通过上下文关系区分其语义)。
可推理性:基于已有的知识三元组和预设规则,能够推导出新的未知知识。例如已知“张三-父亲-张建国”、“张建国-父亲-张老栓”,可推理出“张三-祖父-张老栓”。
多维度扩展性:实体和关系可灵活添加、修改,无需改变整体数据结构,支持
从单一领域(如医疗知识图谱)向跨领域(如医疗+教育+金融知识图谱)
的扩展。
可视化呈现:以图结构形式展示,直观呈现实体间的关联网络,便于人类理解和分析(如通过可视化界面清晰看到“电影-导演-演员-获奖作品”的关联链)。

四、实战代码:基于Python+Py2neo构建简易知识图谱

实战场景

构建一个简易的“文学人物-作品-体裁”知识图谱,包含实体(李白、杜甫、《静夜思》、《春望》)、关系(创作)、属性(人物籍贯、作品年代),并实现数据的创建、查询和可视化。

前置准备

安装Neo4j数据库:下载并安装Neo4j Community Edition(免费版),启动后默认地址为
http://localhost:7474/
,初始账号/密码为
neo4j/neo4j
,首次登录需修改密码。
安装依赖库:


pip install py2neo==2021.2.3  # Neo4j的Python驱动库,兼容主流Neo4j版本

pip install pandas  # 辅助数据处理

实战步骤

步骤1:连接Neo4j数据库

from py2neo import Graph, Node, Relationship, Subgraph
from py2neo.matching import NodeMatcher

# 连接Neo4j数据库(替换为你的Neo4j地址、账号、密码)
graph = Graph(
    "bolt://localhost:7687",  # Neo4j的Bolt协议地址,默认端口7687
    # username="root",
    # password="root"  # 替换为你修改后的密码
)

# 初始化节点匹配器(用于后续查询节点)
node_matcher = NodeMatcher(graph)

# 清空数据库(可选,用于重复测试时避免数据冗余)
graph.delete_all()
print("成功连接Neo4j数据库!")

【图数据库与知识图谱入门】3.1 定义:什么是知识图谱?(完善版)

步骤2:创建实体(带属性)

# 1. 创建人物实体(类别:Poet,附带属性)
li_bai = Node(
    "Poet",  # 实体类别(标签)
    name="李白",
    alias="李太白",
    birth_year=701,
    native_place="陇西成纪"
)

du_fu = Node(
    "Poet",
    name="杜甫",
    alias="杜子美",
    birth_year=712,
    native_place="河南巩县"
)

# 2. 创建作品实体(类别:Work,附带属性)
jing_ye_si = Node(
    "Work",
    title="《静夜思》",
    genre="五言绝句",
    era="盛唐"
)

chun_wang = Node(
    "Work",
    title="《春望》",
    genre="五言律诗",
    era="中唐"
)

# 将实体添加到知识图谱
graph.create(li_bai)
graph.create(du_fu)
graph.create(jing_ye_si)
graph.create(chun_wang)
print("成功创建实体!")
步骤3:创建实体间的关系(带属性可选)

# 1. 创建“李白-创作-《静夜思》”的关系(附带创作地点属性)
create_1 = Relationship(li_bai, "创作", jing_ye_si, create_place="扬州")

# 2. 创建“杜甫-创作-《春望》”的关系
create_2 = Relationship(du_fu, "创作", chun_wang, create_place="长安")

# 3. 可选:创建人物间的关系(李白和杜甫为“好友”)
friend_relation = Relationship(li_bai, "好友", du_fu, acquaintance_year=744)

# 将关系添加到知识图谱
graph.create(create_1)
graph.create(create_2)
graph.create(friend_relation)
print("成功创建关系!")
步骤4:查询知识图谱数据

# 查询1:获取所有诗人的信息
poet_query = """
MATCH (p:Poet)
RETURN p.name AS 诗人姓名, p.alias AS 别名, p.birth_year AS 出生年份, p.native_place AS 籍贯
"""
poet_result = graph.run(poet_query).data()
print("===== 所有诗人信息 =====")
for poet in poet_result:
    print(poet)

# 查询2:获取某部作品的创作者及创作信息
work_query = """
MATCH (p:Poet)-[r:创作]->(w:Work {title:"《静夜思》"})
RETURN p.name AS 创作者, w.title AS 作品名称, w.genre AS 体裁, r.create_place AS 创作地点
"""
work_result = graph.run(work_query).data()
print("
===== 《静夜思》创作信息 =====")
for work in work_result:
    print(work)

# 查询3:获取所有“创作”关系的关联数据
relation_query = """
MATCH (p:Poet)-[r:创作]->(w:Work)
RETURN p.name AS 诗人, w.title AS 作品, r.create_place AS 创作地点
"""
relation_result = graph.run(relation_query).data()
print("
===== 所有创作关系信息 =====")
for rel in relation_result:
    print(rel)
步骤5:可视化查看知识图谱

打开Neo4j浏览器(
http://localhost:7474/
),输入查询语句查看完整图谱:


MATCH (n)-[r]->(m)
RETURN n, r, m

执行后即可在界面上看到可视化的知识图谱:包含4个实体节点(2个诗人、2个作品)、3条关系边(2条创作、1条好友),鼠标悬停在节点/边上可查看对应的属性信息。
【图数据库与知识图谱入门】3.1 定义:什么是知识图谱?(完善版)

【图数据库与知识图谱入门】3.1 定义:什么是知识图谱?(完善版)

步骤6:可选:更新和删除知识图谱数据

# 1. 更新实体属性(为李白添加“逝世年份”属性)
li_bai_node = node_matcher.match("Poet", name="李白").first()
if li_bai_node:
    li_bai_node["death_year"] = 762
    graph.push(li_bai_node)
    print("成功更新李白的逝世年份属性!")

# 2. 删除关系(可选:删除李白和杜甫的“好友”关系)
# friend_del_query = """
# MATCH (p1:Poet {name:"李白"})-[r:好友]->(p2:Poet {name:"杜甫"})
# DELETE r
# """
# graph.run(friend_del_query)
# print("成功删除好友关系!")

【图数据库与知识图谱入门】3.1 定义:什么是知识图谱?(完善版)

五、实战效果说明

执行上述代码后,在Neo4j可视化界面可清晰看到实体节点(不同类别节点默认显示不同颜色)和关系边,形成完整的简易文学知识图谱。
通过Cypher查询语句(Neo4j的图查询语言)可灵活提取各类关联信息,体现了知识图谱结构化查询和语义关联的优势。
该实战代码具备可扩展性,可通过添加更多实体(如“王维”“《山居秋暝》”)、关系(如“推崇”“师承”)和属性,快速扩充知识图谱规模。

六、知识图谱的典型应用场景

智能问答:如智能客服回答“李白的代表作有哪些?”、搜索引擎回答“《春望》的作者是谁?”,背后依赖知识图谱的语义匹配和推理。
推荐系统:如电商平台基于“用户-浏览-手机”“手机-关联-手机配件”的知识图谱,为用户推荐手机壳、充电器等配件。
风控预警:金融领域基于“用户-关联人-逾期记录”“企业-股东-高风险企业”的知识图谱,识别潜在信贷风险。
医疗辅助:医疗知识图谱支持“症状-关联-疾病-对应-药物”的推理,辅助医生快速诊断病情。
学术研究
学术知识图谱(如CNKI知识图谱)可展示“论文-作者-机构-引用-关键词”的关联
,辅助研究人员追踪学术热点。

总结

知识图谱的核心是“实体-关系-属性”的三元组结构化表示,其本质是实现语义化的知识组织与关联。

通过上述实战代码,可快速搭建简易知识图谱并体验其查询与可视化能力,这为后续构建复杂领域知识图谱和智能数据应用奠定了基础。

© 版权声明

相关文章

暂无评论

none
暂无评论...