知识图谱 | 存储与可视化篇

1 知识图谱基础知识

上一篇推文中,笔者已经介绍了知识图谱的基础篇了,那本篇文章为啥一开始还讲基础内容呢?

这部分的基础内容其实是知识图谱存储和与可视化的基础篇,即知识图谱要存储,那存储的是什么呢?本质是图!学名叫“图数据模型”。而有了这个图之后,如何进行查询呢? 这就是第一部分讨论的基础内容~

1.1 数据模型

知识图谱两种主要图数据模型为RDF图和属性图

1.1.1 RDF图

示例见下图:

在这里插入图片描述

  • RDF三元组集合即为RDF图中的有向边集合~
  • RDF图对于节点和边上的属性没有内置的支持
  • 节点属性可以用三元组表示,即上图中的矩形

1.1.2 属性图

属性图应用非常广泛,有节点集和边集组成,满足如下性质:

在这里插入图片描述

示例见下图:

在这里插入图片描述

1.2 查询语言

一旦构建了上述知识图谱的数据模型之后,就可以使用知识图谱查询语言进行查询操作。

  • RDF图对应SPARQL语言

  • 属性图对应Cypher和Gremlin。在下面第三部分将主要介绍Cypher查询语句,在此不再赘述

2 知识图谱存储方法

通过上面第一部分各位小伙伴已经熟悉了数据模型和对应的查询语言,那一旦建立了模型之后,该如何存储呢?毫无疑问,是用数据库来进行存储。那究竟有哪几种数据库呢?

主要有三种:基于关系数据库的存储方案、面向RDF的三元组数据库和原生图数据库。

2.1 基于关系数据库的存储方案

首先关注第一个问题,什么叫关系数据库?是否有对应的菲关系数据库?有的!

  • 关系数据库:指采用了关系模型来组织数据的数据库。简单来说,就是存储结构化数据。比如MySQL,Oracle等
  • 菲关系数据库:比如Redis(可见推文:),存储的是k-v对,而不是结构化数据。

其次,具体存储结构又包括6种:三元组表、水平表、属性表、垂直划分、六重索引和DB2RDF。下面分别介绍:

2.1.1 三元组表

具体见下图:
在这里插入图片描述
简单来说就是把三元组存成数据表的三列~

2.1.2 水平表

具体见下图:
在这里插入图片描述
主语最左边一列拉下来,谓语最上边一行拉过去,宾语在表格中。但这样的问题在于列可能会非常多,维度爆炸

2.1.3 属性表

具体见下图:
在这里插入图片描述
对主语进行归类,相当于对水平表在行维度进行的拆分

2.1.4 垂直划分

具体见下图:
在这里插入图片描述
对谓语进行划分,相当于对水平表在列维度进行的拆分

2.1.5 六重索引

空间换时间的策略,其将三元组全部 6 种排列对应地建立为 6 张表。

优点是快速查找

缺点是存储空间开销大

2.1.6 DB2RDF

一种面向实体的 RDF 知识图谱存储方案

2.2 面向RDF的三元组数据库

专门为存储大规模RDF数据而开发的数据库,支持查询语言SPARQL。

具体有:

  • RDF4J
  • RDF-3X
  • gStore
  • Virtuoso
  • AllegroGraph
  • GraphDB
  • Blazegraph
  • Stardog

2.3 原生图数据库

主要包括 Neo4j(第三部分重点介绍),分布式的JanusGraph和OrientDB,Cayley

2.4 上述三种数据库的比较

存储量级上来看:

RDF三元组数据库(百万到上亿级三元组) < 基于关系数据库(千万到十亿级三元组) < 分布式数据库(几亿到十亿级三元组)
在这里插入图片描述
在这里插入图片描述

3 重点介绍Neo4j

3.1 Neo4j基础及配置

Neo4j的下载和安装就忽略,这个网上有很多教程(放了一个不错的在最后一部分参考中),而且不难。

1、安装完成后,就需要启动Neo4j了,三步:

Step1:在终端执行下述命令

cd XXX/neo4j/bin # XXX是neo4j文件夹路径的前面部分
./neo4j start

Step2:打开浏览器—http://localhost:7474/

Step3:输入用户名 密码 即可~ neo4j用户名及密码:(初始默认)

  • 用户名:neo4j
  • 密码:neo4j

而想要修改密码的话,在语句执行框中执行下述命令即可:

:server change-password

退出数据库执行下面命令即可~

./neo4j stop

2、局域网连接配置

对于希望连接同一网络的电脑能够登陆Neo4j,查看同一个知识图谱的,就需要在配置文件中修改相应内容,具体可以参考链接

3、节点和边类型风格修改

知识图谱的节点和边Neo4j会默认有一个颜色大小的显示,如何修改这一配置呢?两步走

Step1:输入下方命令

:style

Step2:再执行下述命令

:style = 上述Step1的结果(可修改,语句很简单,大家都能看懂的~)

4、Neo4j修改端口—开启多个Neo4j

注:必须下面两个端口同时修改

  • 一个是修改默认7474的端口(neo4j),换成7475(也可以是别的数字)
  • 一个是修改默认7687的端口(bolt),换成7688(也可以是别的数字)

5、服务器端配置Neo4j,配置文件见最后的参考,以及修改端口后的!注意修改后同步修改网页链接上的端口数字~

最后访问的网页为:http://XXX:7474/browser/

其中XXX为服务器地址

3.2 Neo4j导入数据

主要有四种方式

  • neo4j-import
  • batch-import
  • load csv
  • apoc
  • create 语句

对于这四种方式,主要就是适用场景的问题。根据不同的数据量级选择对应方法即可。

  • create 语句: 1 ~ 1w
  • load csv: 0 ~ 1000w
  • neo4j-import: 千万以上
  • batch-import: 千万以上
  • apoc: 1 ~ 数千万

以load csv方式介绍下对应语句

3.2.1 导入节点

LOAD CSV FROM "file:///系统.csv" AS line
create (sys:system{sys_name:line[0], sys_num:line[1]})

注:

  • 系统.csv文件是放在import文件夹下的
  • csv文件去掉列名,通过在语句中定义该列名,如上述例子就是2列的csv,一列系统名称,一列系统编号
LOAD CSV FROM "file:///菜单.csv" AS line
create (men:menu{menu:line[0],menu_num:line[1]})

3.2.2 导入关系

比如上面系统和菜单的关系为 [菜单]-[包含于]-[系统],对应的语句为:

LOAD CSV FROM 'file:///系统_菜单.csv' AS line MATCH (sys:system), (men:menu) 
WHERE sys.sys_num = line[1] AND men.menu_num = line[0] CREATE (men) - [r:包含于] -> (sys) RETURN r;

注:

  • 系统_菜单.csv依旧在import文件夹下的
  • where后面是表联结语句,和MySQL表join一个意思
  • 关系类型可以直接在语句中写,其实也可以在csv中一列,然后用line[x]代替即可~

3.2.3 导入关系(含关系的相关属性)

上面的关系导入,仅仅就一个关系,而并没有涉及这个关系的相关属性,那如何涉及呢?具体见下面的例子:

LOAD CSV FROM 'file:///系统_菜单.csv' AS line MATCH (sys:system), (men:menu) 
WHERE sys.sys_num = line[1] AND men.menu_num = line[0] CREATE (men) - [r:包含于{order:line[3], rule:line[4]}] -> (sys) RETURN r;

注:

  • order和rule就是关系的两个属性,对应csv的第4列和第5列
  • 其余内容和上述一致

3.3 Neo4j可视化

通过上述导入后,就可以在页面上看到导入的节点和关系:
在这里插入图片描述
那如何对于建立好的知识图谱进行可视化呢?首先点击每一个节点或关系,都会默认显示最多25条内容,比如点击【关联】关系之后,结果见下图:
在这里插入图片描述
那有没有更加灵活的通过语句进行可视化的方式呢?以及增删改查?!完全可以!具体见下面一小节~

3.4 Neo4j查询语言—Cypher

1、清除数据库内容

match (n) detach delete n

2、查询语句

# 查询该审核点出发所指向的所有节点及关系—有向
match p=(a_p_2)-[]->() where a_p_2.audit_point_2 ="a、任务书是否存在?" return p;

# 查询该审核点出发所指向的所有节点及关系—无向—去掉箭头
match p=(a_p_2)-[]-() where a_p_2.audit_point_2 ="a、任务书是否存在?" return p;

# 查询自设项目关联的所有二级审核点
match p=(pro_type)-[r:关联]->(a_p_2) where pro_type.project_type ="自设项目" return p;

# 搜索二级审核点+2跳
match data=(a_p_2)-[*1..2]-() where a_p_2.audit_point_2 ="a、任务书是否存在?" return data

# 该审核点+1跳+关联的边
match data=(a_p_2)-[r:关联*1..1]-() where a_p_2.audit_point_2 ="a、任务书是否存在?" return data

3、删除语句

# 直接删除doc的所有节点
MATCH (doc: document) DELETE doc

# 直接删除ter的所有节点
MATCH (ter: terms) DELETE ter

# 注:如果上述表有关系,而不是孤零零的节点,那么需要删除节点对应关系,使用DETACH DELETE 而不是DELETE:
MATCH (pro_type_2: project_type_2) DETACH DELETE pro_type_2 

4、筛选、合并语句

# 将自设项目和青年基金项目的审核点进行union
match p=(pro_type)-[r:关联]->(a_p_2) where pro_type.project_type="自设项目" RETURN a_p_2
Union
match p=(pro_type_2)-[r:关联]->(a_p_2) where pro_type_2.project_type_2="青年基金项目" RETURN a_p_2

# 看一个属性中是否包含某个字符串——比如审计类型筛选
MATCH (a_p_2:audit_point_2) where a_p_2.audit_type contains "结题审计" RETURN a_p_2;

# 对属性中时间进行区间筛选
MATCH (a_p_2:audit_point_2) where a_p_2.validity_period_end >=  "20201224.0" and a_p_2.validity_period_start <=  "20201224.0" RETURN a_p_2

4 参考

  • 属性图和RDF图简要介绍与比较:https://zhuanlan.zhihu.com/p/260430189
  • 关系型数据库 VS 非关系型数据库: https://zhuanlan.zhihu.com/p/78619241
  • Neo4j安装参考:https://blog.csdn.net/huacha__/article/details/81123410
  • Neo4j 批量导入数据的几种方式: http://weikeqin.com/2017/04/14/neo4j-import-data/
  • 服务器端Neo4j的配置文件:https://github.com/RucLee/neo4j_iaap/blob/main/neo4j.conf
  • 服务器端Neo4j修改端口后的配置文件:https://github.com/RucLee/neo4j_iaap/blob/main/super/neo4j.conf
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值