结构化知识抽取案例

news2024/12/30 2:17:40

假设我们有一个包含中文电影信息的数据库表 movies,其中包含以下字段:

  • movie_id (电影ID)
  • title (电影标题)
  • year (上映年份)
  • genre (类型)
  • director (导演)
  • rating (评分)

表中的部分数据如下:

知识抽取步骤

  • 数据获取:从数据库中查询所需的数据。例如,我们可以查询所有评分大于8.5的电影。
  • 数据清洗:对获取的数据进行清洗,去除重复项、空值等。
  • 知识建模:将提取的数据转换为结构化的知识形式,如知识图谱中的节点和边。
  • 知识存储:将提取的知识存储到知识图谱或其他知识库中,以便后续使用。

1. 数据获取 使用SQL查询从数据库中提取评分大于8.5的电影:

SELECT * FROM movies WHERE rating > 8.5;

2. 数据清洗 检查并处理数据中的空值、重复项等。假设数据已经比较干净,无需额外清洗。

3. 知识建模 将提取的数据转换为知识图谱中的节点和边。例如:

节点:

  • 电影节点:肖申克的救赎、教父、黑暗骑士、低俗小说、阿甘正传
  • 导演节点:弗兰克·德拉邦特、弗朗西斯·福特·科波拉、克里斯托弗·诺兰、昆汀·塔伦蒂诺、罗伯特·泽米吉斯
  • 类型节点:剧情、犯罪、动作、爱情

边:

  • 电影与导演之间的关系:肖申克的救赎 -> 弗兰克·德拉邦特
  • 电影与类型之间的关系:肖申克的救赎 -> 剧情,肖申克的救赎 -> 犯罪
  • 电影与评分之间的关系:肖申克的救赎 -> 9.3
  • 电影与上映年份之间的关系:肖申克的救赎 -> 1994

4. 知识存储 将上述知识存储到知识图谱中

用sqlite模拟实现

-- 创建表
CREATE TABLE movies (
    movie_id INTEGER PRIMARY KEY,
    title TEXT NOT NULL,
    year INTEGER NOT NULL,
    genre TEXT NOT NULL,
    director TEXT NOT NULL,
    rating REAL NOT NULL
);

-- 插入数据
INSERT INTO movies (movie_id, title, year, genre, director, rating) VALUES
(1, '肖申克的救赎', 1994, '剧情, 犯罪', '弗兰克·德拉邦特', 9.3),
(2, '教父', 1972, '犯罪, 剧情', '弗朗西斯·福特·科波拉', 9.2),
(3, '黑暗骑士', 2008, '动作, 犯罪', '克里斯托弗·诺兰', 9.0),
(4, '低俗小说', 1994, '犯罪, 剧情', '昆汀·塔伦蒂诺', 8.9),
(5, '阿甘正传', 1994, '剧情, 爱情', '罗伯特·泽米吉斯', 8.8);

用python实现

import sqlite3
from py2neo import Graph, Node, Relationship

# 连接到SQLite数据库
sqlite_db = sqlite3.connect('movie.db')
cursor = sqlite_db.cursor()

# 查询所有评分大于8.5的电影
cursor.execute("SELECT * FROM movies WHERE rating > 8.5")
rows = cursor.fetchall()

# 连接到Neo4j数据库
neo4j_graph = Graph("bolt://localhost:7687", auth=("neo4j", "swpu@swpu"))

# 清除已有数据(可选)
neo4j_graph.run("MATCH (n) DETACH DELETE n")

# 定义节点和关系标签
MOVIE_LABEL = "Movie"
DIRECTOR_LABEL = "Director"
GENRE_LABEL = "Genre"

# 创建节点和关系
for row in rows:
    movie_id, title, year, genre, director, rating = row

    # 创建电影节点
    movie_node = Node(MOVIE_LABEL, id=movie_id, title=title, year=year, rating=rating)
    neo4j_graph.create(movie_node)

    # 创建导演节点
    director_node = Node(DIRECTOR_LABEL, name=director)
    neo4j_graph.merge(director_node, DIRECTOR_LABEL, "name")

    # 创建电影与导演的关系
    relationship = Relationship(movie_node, "DIRECTED_BY", director_node)
    neo4j_graph.create(relationship)

    # 处理多个类型
    genres = genre.split(", ")
    for g in genres:
        genre_node = Node(GENRE_LABEL, name=g)
        neo4j_graph.merge(genre_node, GENRE_LABEL, "name")

        # 创建电影与类型的关系
        relationship = Relationship(movie_node, "BELONGS_TO_GENRE", genre_node)
        neo4j_graph.create(relationship)

# 关闭数据库连接
cursor.close()
sqlite_db.close()

print("数据已成功导入到Neo4j知识图谱中。")

详细解释

  1. 连接SQLite数据库

    • 使用 sqlite3.connect 连接到 SQLite 数据库。
    • 使用 cursor.execute 执行 SQL 查询,获取所有评分大于8.5的电影。
  2. 连接Neo4j数据库

    • 使用 py2neo.Graph 连接到 Neo4j 数据库。需要提供 Neo4j 的 Bolt 地址和认证信息。
  3. 清除已有数据

    • 可选步骤,用于清除 Neo4j 中已有的数据,以便重新导入。
  4. 创建节点和关系

    • 遍历查询结果,为每部电影创建一个 Movie 节点。
    • 为每个导演创建一个 Director 节点,并与电影节点建立 DIRECTED_BY 关系。
    • 将电影的类型拆分为多个类型,并为每个类型创建一个 Genre 节点,与电影节点建立 BELONGS_TO_GENRE 关系。
  5. 关闭数据库连接

    • 关闭 SQLite 和 Neo4j 的连接。

注意事项

  • Neo4j 认证信息:请根据你的 Neo4j 实例配置正确的用户名和密码。
  • Bolt 地址:如果你的 Neo4j 实例不在本地运行,请提供正确的 Bolt 地址。
  • 数据清理:如果不需要每次都清除已有数据,可以注释掉 neo4j_graph.run("MATCH (n) DETACH DELETE n") 这一行。

通过上述步骤,你可以将 SQLite 中的电影数据成功导入到 Neo4j 知识图谱中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2168430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WAF,全称Web Application Firewall,好用WAF推荐

WAF,全称Web Application Firewall,即Web应用防火墙,是一种网络安全设备,旨在保护Web应用程序免受各种Web攻击,如SQL注入、跨站脚本(XSS)、跨站请求伪造(CSRF)等。 WAF通…

第166天:应急响应-拒绝服务钓鱼指南DDOS压力测试邮件反制分析应用日志

案例一:内网应急-日志分析-爆破&横向&数据库 数据库 这里不同数据库日志不一样,我用mysql分析 首先MySQL数据库需要支持远程连接 GRANT ALL PRIVILEGES ON . TO root% IDENTIFIED BY 123.com WITH GRANT OPTION; 其次开启日志 -- 查看general…

Qt_线程介绍与使用

目录 1、QThread常用API 2、Qt线程安全 3、使用线程QThread 4、connect函数的第五个参数 5、Qt互斥锁 5.1 QMutexLocker 6、条件变量 7、信号量 结语 前言: 线程是应用程序开发非常重要的概念,在Qt中,用QThread类来实现多线程&a…

Spring项目中的统一结果返回

本文介绍的是通过Spring提供的接口进行结果统一封装,指的是成功返回的结果,不包含异常或者错误情况(这一块移步到统一异常处理)。另一种统一结果返回的方式,就是手动让每个接口的返回中类型都相同,这种方法…

ant design vue组件中table组件设置分组头部和固定总结栏

问题:遇到了个需求,不仅要设置分组的头部,还要在顶部有个统计总和的栏。 分组表头的配置主要是这个,就是套娃原理,不需要展示数据的直接写个title就行,需要展示数据的字段才需要详细的配置属性。 const co…

实现简易 vuedraggable 的拖拽排序功能

一、案例效果 拖拽计数4实现手动排序 二、案例代码 <draggable:list"searchResult.indicator":group"{ name: indicators }"item-key"field"handle".drag-handle-icon"><divclass"field-item"v-for"(item…

YOLOv8+注意力机制+PyQt5玉米病害检测系统完整资源集合

资源包含可视化的玉米病害检测系统&#xff0c;基于最新的YOLOv8注意力机制训练的玉米病害检测模型&#xff0c;和基于PyQt5制作的可视玉米病害系统&#xff0c;包含登陆页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的七类玉米病害&#xff1a;矮花叶病…

Java每日面试题(mysql优化)(day14)

目录 连接查询MySQL常用函数汇总SQL Select 语句的执行顺序数据库三范式MyISAM 存储引擎 与 InnoDB 引擎区别索引索引的优缺点索引的分类索引结构B树与B树的区别索引失效的几种情况 数据库锁MySql 优化 连接查询 MySQL常用函数汇总 SQL Select 语句的执行顺序 数据库三范式 第一…

物联网网络中集中式与分布式SDN环境的比较分析

论文标题&#xff1a;Comparative Analysis of Centralized and Distributed SDN Environments for IoT Networks 中文标题&#xff1a;物联网网络中集中式与分布式SDN环境的比较分析 作者信息&#xff1a; Khirota G. Yalda, Diyar J. Hamad, Nicolae Tapus罗马尼亚布加勒斯…

科研绘图系列:R语言树结构聚类热图(cluster heatmap)

文章目录 介绍加载R包导入数据数据预处理画图修改图形导出数据系统信息介绍 热图结合树结构展示聚类结果通常用于展示数据集中的模式和关系,这种图形被称为聚类热图或层次聚类热图。在这种图中,热图部分显示了数据矩阵的颜色编码值,而树结构(通常称为树状图或聚类树)则显…

【高中数学/函数/零点】求分段函数f(x)=x^2-4x+2(x>=1) f(x)=|lg(1-x)| (x<1)的零点个数

【问题】 已知分段函数f(x)x^22x(当x<0时)&#xff0c;f(x)|lgx|(当x>0时)&#xff0c;则函数g(x)f(1-x)-1的零点个数为几个&#xff1f; 【来源】 《高考数学极致解题大招》P137 变式训练第1题 中原教研工作室编著 【解答】 f(1-x)-10即f(1-x)1 当1-x>0,即x&l…

遍历9个格子winmine!StepBlock和遍历8个格子winmine!StepBox的对决

遍历9个格子winmine!StepBlock和遍历8个格子winmine!StepBox的对决 第一部分&#xff1a;windbg调试记录。 0: kd> g Breakpoint 10 hit winmine!DoButton1Up: 001b:0100390e a130510001 mov eax,dword ptr [winmine!xCur (01005130)] 0: kd> kc # 00 winmine…

基于JAVA+SpringBoot+Vue的健身房管理系统1

基于JAVASpringBootVue的健身房管理系统1 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈喽…

element ui中当el-dialog需要做全屏时,.fullscreen样式修改问题

element ui 饿了么UI中el-dialog样式修改问题 场景解决方法就是&#xff1a;去掉底部样式中的scoped,然后再进行页面级样式的更改即可。 场景 最近在使用element-ui时&#xff0c;使用到了弹窗组件&#xff1a; element-ui 官网链接地址&#xff1a; element-ui 官网链接地址…

C语言指针系列1——初识指针

祛魅&#xff1a;其实指针这块儿并不难&#xff0c;有人说难只是因为基础到进阶没有处理好&#xff0c;大家要好好跟着一步一步学习&#xff0c;今天我们先来认识一下指针 指针定义&#xff1a;指针就是内存地址&#xff0c;指针变量是用来存放内存地址的变量&#xff0c;在同一…

Java线程的三大特性

原子性: 线程任务不可再分。 int i 1; i; 原子类 AtomicXXX 可见性: 线程之间的操作是互相不可见的。 volatile //线程A如果&#xff0c;flag为true&#xff0c;就运行打印语句 A: trueThread t1 new Thread(() -> {while (true) {if (flag) {System.out.println(&q…

卷积神经网络-迁移学习

文章目录 一、迁移学习1.定义与性质2.步骤 二、Batch Normalization&#xff08;批次归一化&#xff09;三、ResNet网络1.核心思想2.残差结构&#xff08;1&#xff09;残差块&#xff08;2&#xff09;残差结构类型 四、总结 一、迁移学习 迁移学习&#xff08;Transfer Lear…

zabbix基本概念与组件

文章目录 一、zabbix简介二、​​​​​​​zabbix构成三、​​​​​​​zabbix监控对象四、​​​​​​​zabbix常用术语五、 Zabbix 6.0 新特性1.Zabbix server高可用防止硬件故障或计划维护期的停机2.Kubernetes系统从多个维度采集指标 六、zabbix 工作原理1、主动模式2、…

操作配置笔记

一、检查&#xff1a; 1.查看当前配置 display current-configuration 2.查看路由表 display ip routing-table 3.查看当前配置情况 display this 4.查看当前设备版本 display version 5.查看接口 display interface display ip interface 6.查看保存的当前配置 display sav…

openinstall鸿蒙SDK再升级,功能全面支持HarmonyOS NEXT

万众期待的鸿蒙操作系统HarmonyOS NEXT即将发布&#xff0c;国产自主的全场景智能操作系统诞生&#xff0c;将为生态伙伴共创共享创造新蓝海&#xff0c;鸿蒙生态的加速构建&#xff0c;也有望催生出互联网生态的第三极。 作为首批鸿蒙生态伙伴&#xff0c;openinstall在App渠…