知识图谱从0到-1的笔记——3.知识存储

开始知识图谱从0到-1,用的书是《知识图谱方法、实践与应用》,做些阅读笔记,如有错误内容,望各位指正。

知识存储

  • 知识存储
    • 1. 知识图谱数据库
      • 1.1 知识图谱数据模型
        • 1.1.1 RDF图
        • 1.1.2 属性图
      • 1.2 知识图谱查询语言
        • 1.2.1 SPARQL
        • 1.2.2 Cypher
        • 1.2.2 Gremelin
      • 1.3常用的知识图谱比较
    • 参考

知识存储

    随着知识图谱规模日益增长,数据管理愈加重要。当我们得到用于构建知识图谱地知识时,并选择了合适地方法对知识进行建模和表示之后,就要考虑对知识的持久化存储。知识图谱以图结构来对知识进行建模和表示,所以常将知识图谱中的知识作为图数据进行存储。大规模的知识图谱的运用时考虑使用数据库管理系统对知识进行存储。
主要有以下两个需求的原因:

  1. 一方面,以文件形式保存的知识图谱显然无法满足用户的查询、检索、推理、分析及各种应用需求
  2. 传统数据库的关系模型与知识图谱的图模型之间存在显著差异,关系数据库无法有效地管理大规模知识图谱数据。

1. 知识图谱数据库

1.1 知识图谱数据模型

从数据模型来看,知识图谱本质上是一种图数据,所以知识图谱模型基于图论中的图定义,用节点集合表示实体,用边表示表示实体间的联系。目前表示知识图谱的两种主要图数据模型有:RDF图属性图

1.1.1 RDF图

RDF是W3C制定的在语义万维网上表示和交换机器可理解信息的标准数据模型。
RDF用三元组的结构来描述资源

  • 每个三元组由主语(Subject)、谓词(Predicate)、宾语(Object)这样的三个元素组成
  • 每一个三元组称为陈述(Statement)、多个语句的集合称为描述(Description)

下图是一个软件开发公司的社会网络图,其中有张三、李四、王五和赵六4名程序员,有“图数据库”和“RDF三元组库”两个项目。从下图可以得出信息。

  1. 张三认识李四和王五
  2. 张三、王五和赵六参加“图数据库”的开发,并且该项目使用的是Java语言
  3. 王五参加"RDF三元组库”的开发,该项目使用C++语言。
    知识图谱从0到-1的笔记——3.知识存储_第1张图片
  • 常用的三元组存储系统有:gStore、Virtuoso、AllegroGraph、RDF4J等。
    知识图谱从0到-1的笔记——3.知识存储_第2张图片

1.1.2 属性图

属性图可以说是目前被图数据库业界采纳最广的一种图数据模型。属性图由节点集和边集组成。有以下几个特点:

  • 由节点和边构成

  • 每个节点具有唯一的id

  • 节点可以有属性(键值对)

  • 边有一个类型和方向

  • 边也可以有属性
    知识图谱从0到-1的笔记——3.知识存储_第3张图片

  • 常见的图数据库有:Neo4j,JanusGraph,ArangoDB,TigerGraph
    知识图谱从0到-1的笔记——3.知识存储_第4张图片

  • 数据库性能的对比
    知识图谱从0到-1的笔记——3.知识存储_第5张图片

1.2 知识图谱查询语言

目前,RDF图上的查询语言是SPARQL;属性图查询语言常用的是Cypher和Gremelin

1.2.1 SPARQL

SPARQL已经在上一章知识表示与建模介绍过了,在此就不多做介绍。

1.2.2 Cypher

Cypher最初是图数据Neo4j中实现的属性图数据查询语言。与SPARQL一样,Cypher也是一种声明式的语言

# 查询图中所有程序员节点
MATCH(p:程序员)
Return p
# 查询程序员与"图数据库"项目之间的边
MATCH(:程序员)-[r]->(:项目{name:'图数据库'})
return r
# 查询从节点1出发的标签为"认识“的边
MATCH (1:程序员)-[r:认识]->()
Return r
# 查询节点1认识的30岁以上的程序员参加的项目名称
MATCH(1:程序员) - [:认识]->(p:程序员),(p)-[:参加] ->(pr:项目)
WHERE p.年龄 >30
RETURN pr.项目
# 查询年龄为29的参加了项目3的程序员参加的其他项目及其直接或间接认识的程序员参加的项目
MATCH(p:程序员{年龄:29})-[:参加]->(3:项目),(p)-[:认识*0..]->()-[:参加]->pr(:项目)
return pr

1.2.2 Gremelin

Gremlin是Apache TinkerPop图计算框架提供的属性图查询语言,Gremlin为过程式语言。

#列出图中所有节点的属性
g.V
#列出图中国所有的边
g.E
#查询从节点1出发的标签为"认识"的边
g.V(1).outE("认识")
#查询节点1认识的30岁以上的程序员参加的项目名称
g.v(1).out'认识'.filter{it.年龄>30}.out('参加').项目
#查询年龄为29的参加了项目3的程序员的其他项目及其直接或间接认识的程序员参加的项目
g.v(3).in('参加').has('年龄',29).as('x').out('认识').loop('x'){it.loops>=0}.out('参加').as('y')

1.3常用的知识图谱比较

下面将对常用的知识图谱数据库进行比较

  • 对于一般在百万到上亿级的三元组管理,使用稍高的配置的单机系统和主流RDF三元组数据库(如Jena、RDF4J、Virtuoso等)完全可以胜任
  • 如果需要管理几亿到十几亿以上的大规模RDF三元组,则可以尝试部署具备分布式存储与查询的数据库系统(GraphDB和BlazeGraph、开源的JanusGraph等)
  • Neo4j的图数据库改系统发展迅猛,使用图数据库管理RDF三元组也是一种很好的选择,但目前大多数图数据库不直接支持RDF三元组存储,此时可以采用数据转换方式,将RDF转换为图数据库支持的数据库格式(如属性图模型)
  • 知识图谱从0到-1的笔记——3.知识存储_第6张图片

参考

  1. https://github.com/npubird/KnowledgeGraphCourse

你可能感兴趣的:(知识图谱,知识图谱,数据库,人工智能)