【知识图谱搭建到应用】--知识存储--04

news2024/11/23 7:00:04

文章目录

  • Mysql+jena+fuseki
    • 数据存储
    • 数据建模
    • 数据映射
    • 注意事项
  • py2neo+neo4j
    • Py2neo与Neo4j的版本问题
    • Py2neo导入三元组数据
    • 批量导入csv文件
  • rdflib库

前面几篇在讲述骗理论的内容,本片主要描述如何将清洗过的结构化数据存储在转换成三元组并存储起来,并于后续使用。

Mysql+jena+fuseki

数据存储

对于清洗后的结构化数据都会存储在Mysql等关系型数据库中,一张表相当于一个类,一列相当于一个属性;可以将多种类数据存放在一张表中,但一般会根据实际情况将不同类的数据存储的多张表中,通过外键实现表之间的连接。每张表中的一行就是一个实例,一般会给每个实例分配一个独一无二的id,然后可id指定实例之间的关系。

数据建模

前面也提到过,在数据搜集、清洗过程中,要一直基于项目范围或需求,改善、优化知识建模。到目前,这一步已不是必须的,进行建模后,后续数据映射过程会更容易理解,主要使用的工具是protégé,也就是进行本体建模,protégé导出的文件一般后缀是.owl。

数据映射

对储存在mysql中的数据进行关系映射,可以使用工具D2RQ完成。可以使用D2RQ通过jdbc访问mysql数据库,将存储的数据映射为ttl文件;基于数据建模得到的本体文件中的结构关系,对生成的ttl文件进行修改;再使用D2RQ根据修改后ttl文件生成nt文件(N-TRIPLE格式的文件),里面保存的就是RDF数据。可以借鉴此链接https://blog.csdn.net/smallsmallbright?type=blog下的文章

  1. 数据存入mysql后,在D2RQ的安装目录下进入终端,运行以下指令generate-mapping -u $usrname -p $passward –o 映射文件.ttl jdbc:mysql:///mysql中对应数据库的名字,生成数据库的映射文件
  2. 根据构建的owl文件对基于数据库生成的映射关系的ttl文件修改
  3. 基于修改后的ttl文件建立nt文件,可以在D2RQ的安装目录下使用以下指令:.\dump-rdf.bat –o RDF文件.nt 映射文件.ttl,生成的RDF文件.nt中存放的就是三元组信息。D2RQ输出的默认格式是N-TRIPLE,即nt,其还支持TURTLE、RDF/XML等格式的,如果需要导成nt外的其他格式,需要使用-f进行指定,如下面的指令.\dump-rdf.bat -f TURTLE -o poem_kbqa.turtle poem_demo_mapping.ttl,就是基于ttl文件将mysql里面数据转换为TURTLE格式,后缀就是小写,即.turtle。.\dump-rdf.bat -f RDF/XML -o poem_kbqa.rdf poem_demo_mapping.ttl是导出为RDF格式
  4. 在jena的安装目录下创建tdb文件夹用于存放tdb数据,再进入jena目录下的bat目录,启动终端,通过指令 .\tdbloader.bat --loc=“E:\apache-jena-3.8.0\tdb”“E:\d2rq-0.8.1\RDF文件.nt” 在tdb文件夹创建数据
  5. 再进入Fuseki文件夹,第一次需要运行fuseki-server.bat文件自动创建run文件夹,将在protégé中创建导出的本体文件.owl移动到run文件夹下面的databases中,并将后缀修改为ttl。在run文件夹下的configuration文件加中创建一个fuseki_conf.ttl的文本文件(取名随意),不同项目大体相同,但需要进行部分修改
  6. 最后在Fuseki文件夹下运行以下指令开启endpoint服务 .\fuseki-server.bat --loc=E:\SoftwareInstallation\jena\apache-jena-3.8.0\tdb /poem_demo (此处的poem_demo与放在run/databases文件夹下的ttl文件同名,同时在run/configuration文件夹下面的fuseki_conf.ttl也要进行相应的修改)

注意事项

  • 使用jena开启endpoint服务时,不要在之前启动过的tdb文件夹下开启,如果之前开启过其他项目的endpoint文件,最好把tdb文件夹删除重建或情况tdb文件夹,再在jena的bat目录重新使用指令.\tdbloader.bat --loc=“E:\apache-jena-3.8.0\tdb” “E:\d2rq-0.8.1\RDF文件.nt”(该问题待确认)
  • 可以直接先以空的文件夹,用fuseki开启服务,然后访问localhost:3030地址后使用其提供的输入导入功能将创建好的nt文件导入。直接进入apache-jena-fuseki的文件夹,创建一个用以存放tdb数据的文件夹,名字可以自定义;终端也切换到apache-jena-fuseki文件夹下,使用指令:fuseki-server --loc=store --update /testds,其中sotre替换成前面创建的文件夹的名称,–update表示支持SPARQL Update数据更新操作,/tests是指定上传的数据集在服务上的名称。执行完指令后fuseki服务就启动了。
  • 基于创建的nt文件使用jena启动endpoint服务前,生成tdb文件时创建的文件夹的名称不一定非要是“tdb”,任何名称都可以,只需要在上述步骤e和g中的–loc=后指定相应的路径就可以了。这样把不同图谱项目的文件存放在不同的文件夹下,并且启动时进行对应文件夹启动,就能防止知识混乱的问题

py2neo+neo4j

neo4j是目前使用最广泛的图数据库,其支持csv文件的直接导入,并且python的第三方库py2neo可以对neo4j进行访问、连接、节点和关系创建等操作。

Neo4j也支持owl、nt等RDF数据的导入,但是需要进行配置修改。首先根据安装的neo4j的版本至https://github.com/jbarrasa/neosemantics/releases网址下载对应版本的第三方的RDF文件导入库,文件后缀是.jar,将该文件放在neo4j安装目录中的plugins文件夹下;再在安装目录中conf文件夹下的neo4j.conf配置文件中的最后一行提交该语句“dbms.unmanaged_extension_classes=semantics.extension=/rdf”;保存后重启neo4j。启动后访问localhost:7474地址连接neo4j,初始密码和账号都是neo4j,运行查询语句 :GET /rdf/ping,如果返回{“ping”:“here!”}表明配置成功,可导入RDF文件了。

先执行CREATE INDEX ON :Resource(uri)语句,在数据库中创建一个名为Resource的节点,然后再执行CALL semantics.importRDF(“file:///{PROJECT_PATH}/RDF文件.nt”,“N-Triples”)语句,其中的${PROJECT_PATH}就是RDF文件.nt存放的绝对路径,到此就完成了nt文件的导入,使用call db.schema()语句,将Resource隐藏,能够看到nt文件中蕴含的schema结构。

在导入nt文件时,如果属性值存在特殊字符,如%、/等需要使用百分号编码,如%的百分号编码就是%25,不然会出现错误,使得导出失败;可以在终端进入neo4j的安装目录下的bin目录,执行neo4j.bat console开启服务,再执行导入指令,出现的错误编码会终端中输出,根据输出的错误信息进行问题定位。具体操作步骤可参考https://blog.csdn.net/ZHOUBEISI/article/details/84863503

导入RDF/XML文件的语句:CALL semantics.importRDF(“file:///E:/project5-kg-wash-function/rdf_file_20220825/xihu_with_cvt_0829_protege.rdf”, “RDF/XML”)

Neo4j的缺点:社区版本的单机系统,企业版知识高可用性集群,但是并不是真正的分布式图存储系统,其每个存储节点上都要存储完整副本,而不是将图数据划分为子图进行分布式存储。如果图数据超过一定规模,系统性能会因为磁盘、内存等限制而大幅降低

Py2neo与Neo4j的版本问题

当前本地安装的neo4j版本是3.5.30,使用4.0.0和2020版本的py2neo可以进行操作,2021.2.3版本的py2neo就不能操作该版本的neo4j。当neo4j版本升级为4.0以上版本时,前面列举的两个版本的py2neo又不能对该版本的neo4j进行操作;2021.2.3版本的py2neo可以对4.0版本的neo4j进行操作,但是该版本的py2neo又不能对3.5.30版本的neo4j进行操作。并且当使用2021.2.3版本的py2neo时,使用run函数执行cypher代码时,会报错不能将neo4j返回的数据解析为json类型数据,使得运行不成功;但是4.0.0和2020版本的py2neo却可以正常解析。使用2020.1.0版本的neo4j后可以解决上述问题,对当前3.5.30和4.0以上版本的neo4j都能进行操作,并且也能正常返回索引内容,推荐使用该版本的py2neo。

Py2neo导入三元组数据

  1. 针对项目要求,构建好本体架构,要确定一个知识图谱展开的中心类;如医疗问答的知识图谱的中心应该是疾病,而诗歌类型的知识图谱的中心应该是诗人等
  2. 节点的抽象定义相当于是一个class,而该类型的节点下的一个实体就相当于该class的一个实例;节点与节点之间的关系就是对象属性,而节点与一个单纯的值之间的关系就是数值属性。处理好数据后,要根据本体架构,提炼出所有节点的类型、节点与节点之间的关系(就是对象属性)以及每个节点拥有的属性(就是数值属性,如name)
  3. 遍历数据,将所有的节点、关系归纳保存,同时将中心类的所有数值属性单独保存,如果非中心类节点除了name还有以外的数值属性,也最好针对每个节点实例保存其所有的数值属性。使用py2neo先创建所有的中心类的节点实例,再创建其他非中心类的节点实例
  4. 再基于提取出的节点实例之间的对象属性即节点之间的关系,结合cypher查询语言进行关系创建,到此基本完成知识导入。在neo4j中可通过call db.schema()查看neo4j中存储的所有数据的scheme,即本体架构。

批量导入csv文件

除上述的三元组导入方式外,Neo4j支持直接从csv文件中导入

  1. 首先将csv文件的编码格式设置为utf-8,否则易出现中文乱码情况

  2. 正常情况下,要将csv文件放置在neo4j安装目录的import目录下,如果需要从远程或者本地其他目录下导入数据,要将安装目录中conf下的neo4j.conf文件中进行一下修改
    在这里插入图片描述

  3. 同样如使用py2neo导入数据一样,需要先从原始数据中提取出实体和关系,一般是将相同类存储在同一个csv文件中,第一列是ID,其实必须要的,后续的字段就相当于是给类的属性,也就是数值属性,不同的类存储在不同的csv文件中。然后将所有的关系存储在一个独立的csv文件中,一般是存储关系开始实体ID,关系结束实体ID,以及对应关系的类型

  4. 将实体和关系存储为csv文件后,就可以使用cypher语言或者apoc进行数据的批量导入,需要注意的是一般csv文件的第一行的字段名,使用cypher导入时语句添加with headers,就可使用line.value 或line[value]来获取每行即一个实体每个属性对用的值。如果一个实体拥有两个表示,就是属于两个类,最好是将该数据分别存在两个不同类的csv文件中。详情可参考此链接:
    https://blog.csdn.net/sinat_36226553/article/details/108547440

rdflib库

如前面介绍所示,rdflib库可以直接创建rdf文件,也能解析已存在的rdf文件,然后在其上进行修改。如果构建好了csv的结构化文件,可以使用rdflib创建图,在其中声明类、实例、对象属性和数值属性,然后将图序列化为所需的rdf文件格式,目前其支持所有常用的rdf文件格式,如turtle、nt、n3、xml等(xml等价与‘RDF/XML’)。

使用rdflib创建实体节点时,需要在Namespace中声明唯一标识符,一定要注意不同实体节点的唯一标识符不能相同,实体的name属性可以相同,或者说所有属性都可以相同,但如果是两个不同的实体节点,就要赋予不同的唯一标识符。

在导入之前,可以先使用protégé将使用rdflib生成的rdf文件打开查看一下本体、关系是否正确合理,也可以进行一次转存,即使用protégé另存为所需的格式。如果所需的格式是protégé中不支持的,可以先保存为“RDF/XML”格式,再使用rdflib解析保存为所需格式。目前经过实践,按照前文“py2neo+neo4j“中描述的方法,Neo4j支持N-Triples、RDF/XML、Tutle格式的文件导入。

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

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

相关文章

ChatGPT与软件架构(4) - 架构师提示工程指南

架构师可以通过各种类型的对话提示,提升驱动ChatGPT对话输出的质量,更好的利用AI能力辅助架构设计。原文: Software Architects’ Guide to Enhancing ChatGPT Interactions With Prompt Types Robert Stump Unsplash 前言 随着ChatGPT等人工智能语言模型…

12.数据结构之AVL树

前言 提到平衡二叉查找树,不得不提二叉查找树。二叉查找树,说简单点,其实就是将我们的数据节点,有序的维护为一个树形结构。这样我们查的时候,那么我们查找某个节点在不在集合中的时间复杂度实际上就是树的高度。如果…

华为OD机试真题 Java 实现【玩牌高手】【2023 B卷 100分】,附详细解题思路

一、题目描述 给定一个长度为n的整型数组,表示一个选手在n轮内可选择的牌面分数。选手基于规则选牌, 请计算所有轮结束后其可以获得的最高总分数。 选择规则如下: 在每轮里选手可以选择获取该轮牌面,则其总分数加上该轮牌面分…

python笔记 第二章 变量

系列文章目录 第一章 初识python 文章目录 2.1变量2.1.1变量的作用2.1.2定义变量标识符命名习惯使用变量 2.2 认识bugDebug工具Debug工具使用步骤: 2.3 数据类型 2.1变量 目标 变量的作用定义变量认识数据类型 2.1.1变量的作用 变量就是一个存储数据的的时候当前数据所在的…

Java基础——堆和栈、static关键字、静态变量和成员变量的区别

Java程序运行顺序:Java应用程序—虚拟机—操作系统—硬件 Java中栈内存用来存储局部变量和方法调用,堆内存用来存储Java中的对象,成员变量、局部变量、类变量指向的对象都存储在堆内存中。 static关键字: 随着类的加载而加载优先…

ISATAP隧道配置与验证

ISATAP隧道配置与验证 【实验目的】 熟悉IPv6ISATAP隧道的概念。 掌握IPv6和IPv4共存的实现方法。 掌握IPv6 ISATAP地址编址规则。 掌握IPv6 ISATAP隧道的配置。 验证配置。 【实验拓扑】 设备参数如下表所示。 设备 接口 IP地址 子网掩码 默认网关 R1 S0/0 192.…

【内存管理大猫腻:从“越界”到“内存泄漏”应有尽有】

本章重点 什么是动态内存 为什么要有动态内存 什么是野指针 对应到C空间布局&#xff0c; malloc 在哪里申请空间 常见的内存错误和对策 C中动态内存“管理”体现在哪 什么是动态内存 动态内存是指在程序运行时&#xff0c;根据需要动态分配的内存空间。 #include <stdio.h&…

1.链表的实现:不带哨兵

一、链表linked list 1.定义 链表是数据元素的线性集合&#xff0c;其每个元素都指向下一个元素&#xff0c;元素存储上并不连续,链表逻辑连续。 2.分类 ①单向链表&#xff1a;每个元素只知道其下一个元素是谁 ②双向链表: 每个元素知道其上一个元素和下一个元素 ③循环链…

Java - Stream流详解

文章目录 前言 大家好,好久不见了,最近由于实训的影响导致拖更了,在更新这一次估计javaSE基本上就算是完结了,还有一些落下的后面也会补上的,下次见面就是数据结构了 尽情期待吧!那么就让我们步入Stream流的学习吧! 一、Stream流是什么&#xff1f; Stream流是Java 8中的一个…

【openEuler 20.03 TLS编译openGauss2.0.0源码】

openEuler 20.03 TLS编译openGauss2.0.0源码 一、安装环境二、安装前准备二、安装步骤 一、安装环境 项目Value操作系统openEuler 20.03 64bit with ARMopenGauss2.0.0openGauss-third_party2.0.0 二、安装前准备 项目Value购买华为ECS鲲鹏 8vCPU32G 100M/s带宽 openEuler 2…

使用CubeMX配置STM32驱动HC-SR04超声波模块

文章目录 前言1 使用STM32CubeMX初始化代码1.1 时钟配置1.2 设置定时器1.3 触发引脚1.4 串口配置 2 代码编写2.1 添加驱动文件2.2 修改main.c 3 实现效果参考 前言 硬件选择 stm32f103c8t6&#xff08;最小板&#xff09;hc-sr04超声波模块 软件环境 stm32cubeIDE 1.12.1 …

【Linux】TCP网络套接字编程+协议定制+序列化和反序列化

悟已往之不谏&#xff0c;知来者之可追。抓不住的就放手&#xff0c;属于你的都在路上…… 文章目录 一、TCP网络套接字编程1.日志等级分类的日志输出API2.单进程版本的服务器客户端通信3.多进程版本和多线程版本4.线程池版本5.守护进程化的线程池服务器6.三次握手和四次挥手的…

python编程——pycharm的安装与使用

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、python IDLE的使用 二、pycharm的安装与使用 1、…

十分钟带你看懂——Python测试框架之pytest最全讲

pytest特短 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有以下几个特点&#xff1a; 简单灵活&#xff0c;容易上手 支持参数化 能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/appnium等自动化测试、接口自动化测试&#xff08…

重磅版本发布|三大关键特性带你认识 Milvus 2.2.9 :JSON、PartitionKey、Dynamic Schema

亮点颇多、精彩程度堪比大版本的 Milvus 2.2.9 来啦&#xff01; 随着 LLM 的持续火爆&#xff0c;众多应用开发者将目光投向了向量数据库领域&#xff0c;而作为开源向量数据库的领先者&#xff0c;Milvus 也充分吸收了大量来自社区、用户、AI 从业者的建议&#xff0c;把重心…

非常简单就能理解的 链表带环问题 你也能轻松学会!

文章目录 判断链表是否带环若链表带环找出环的入口其他高频的面试问题 判断链表是否带环 题目描述&#xff1a; 给定一个链表&#xff0c;判断链表中是否有环。 思路&#xff1a; 可以明确的是&#xff1a;若一个链表带环&#xff0c;那么用指针一直顺着链表遍历&#xff0c…

《嵌入式系统》知识总结10:使用位带操作操纵GPIO

位操作 汇编层面 外设控制常要针对字中某个位&#xff08;Bit&#xff09;操作 以字节编址的存储器地址空间中&#xff0c;需要3步骤&#xff08;读出-修改-写回&#xff09; 1.&#xff08;从外设&#xff09;读取包含该位的字节数据 2. 设置该位为0或1、同时屏蔽其他位&am…

微信小程序 <view></view>容器嵌套,wxss样式修改内部内部样式不产生效果

网上关于”微信小程序讲的知识很少“&#xff0c;微信开发文档对于新手不是很友好&#xff0c;但是建议一定要学会看文档。 问题如下&#xff1a; 我写了好几个<view></view> 容器嵌套&#xff0c;我在对内部容器包括的内容做修改时&#xff0c;不产生效果&#…

apache RocketMQ远程代码执行(CVE-2023-33246)

RocketMQ是阿里巴巴在2012年开发的分布式消息中间件&#xff0c;专为万亿级超大规模的消息处理而设计&#xff0c;具有高吞吐量、低延迟、海量堆积、顺序收发等特点。它是阿里巴巴双十一购物狂欢节和众多大规模互联网业务场景的必备基础设施。 RocketMQ的NameServer、Broker、…

【计算机网络之HTTP篇】Cookie与Session的区别

目录 Cookie 原理 缺点 Session 原理 区别 Cookie cookie是浏览器在本地存储数据的一种机制。 原理 当浏览器向服务器第一次发送请求时&#xff0c;服务器会向浏览器返回一个Cookie&#xff0c;此时 cookie记录着浏览器访问服务器的用户登录状态。 后续浏览器再次访问服…