图数据库-复杂关系型数据的查询优化

图数据库-复杂关系型数据的查询优化

    • 一、背景
    • 二、图数据库
        • 1. 图数据库
        • 2. 图论
        • 3. 应用场景
    • 三、Neo4j图数据库实践用例
        • 1. 基本元素与概念
        • 2. 节点创建
        • 3. 节点查询
        • 4. 关系查询
        • 5. Cypher查询语言
    • 四、Neo4j程序开发
    • 五、复杂关系型数据的查询优化
        • 1. 优化前查询逻辑
        • 2. 优化后查询逻辑
    • 七、参考文献

一、背景

    关系型数据库在处理以下几个问题时往往会显得捉襟见肘:

  • 关联查询中涉及到的关系可能会经常性的变化、增加、修改、或者删除。更新其中一种关系时需要及时更新与之相关的其他关系,需要消耗额外的人力去记录所有的关联关系,以保证状态数据更新时不出错。例如,某个落地页实体ID与文案实体ID分别对应于同一个广告主实体ID,当修改了广告主实体表中的ID后,未同时更新落地页实体与文案实体中对应的广告主ID,这会导致多种关系发生断链
  • 涉及到需要拼接合并多个实体数据的时候。相当于需要合并多个请求的响应结果,增大了网络请求压力
  • 知识图谱型数据挖掘与展示。例如查询投放某个物料的全部广告主时,若采用关系型数据库,group的性能会随着结果的数量增大而降低

二、图数据库

1. 图数据库

    基于图论实现的一种新型noSql数据库,其数据库存储结构和数据的查询方式都是以图论为基础的,图论中图的基本元素为节点和边,在图数据库中对应的就是节点和关系。
    常用图数据库

2. 图论

    以图为研究对象,图由若干给定的点及连接两点的线所组成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。

3. 应用场景

    图数据库适用场景:

  • 辅助搜索:如社交网络,类似facebook兴趣图谱可以辅助推荐一些兴趣相似或者有联系的用户
  • 辅助问答:如知识问答,通过将知识建设成图的形式,可以把问题回答的更准确和可靠
  • 辅助决策:通过结合图相关的算法,如PageRank、mcl、betweenness等可以通过图数据库的优势挖掘或者推理出一些信息,辅助业务决策

    图数据库不适用场景:

  • 统计、报表分析
  • 不适合写多读少的场景。在写入或者删除时候,需要维护关系的链接指针。因此大量而频繁的写操作,在性能上是一个考验。

三、Neo4j图数据库实践用例

1. 基本元素与概念

  • 节点(node):表示一个实体记录,类似于关系数据库中的一条记录,一个节点包含多个属性和标签
  • 关系(relationship):用于将节点关联起来构成图,关系也称为图论的边(edge)
  • 属性(property):节点和关系都可以有多个属性,属性由键值对组成,类似于Java中哈希表
  • 标签(label):指示一组拥有相同属性的节点,但不强制要求相同,一个节点可有多个标签
  • 路径(path):任意两个节点都存在由关系组成的路径,路径有长短之分

2. 节点创建

# 创建一个有两个属性(name="tuing big movie",time=100)、一个标签(Movie )的节点
CREATE (:Movie{
     name:"tuing big movie", time:100})

3. 节点查询

MATCH  (a:Movie{
     name:"tuing big movie", time:100}) return a;

4. 关系查询

5. Cypher查询语言

    一种声明式图数据库查询语言,类似于关系数据库中的SQL,Cypher借鉴了其他如SQL、Python语言的惯用语法。基本语法:

  • MATCH:匹配图模式
  • WHERE:过滤条件
  • RETURN:定义返回的结果
  • 增(CREATE)、删(DELETE)、改(SET)、查(MATCH)

    实例:创建小猪佩奇一家关系

  • 猪爷爷 猪奶奶
    • 猪爸爸 猪妈妈
      • 乔治 佩奇
//1.创建基础节点
CREATE (:pig{
     name:"猪爷爷",age:15}),create (:pig{
     name:"猪奶奶",age:13}); 
//2.基于现有节点创建关系
MATCH (a:pig{
     name:"猪奶奶"}) match (b:pig{
     name:"猪爷爷"}) create (a)-[r:夫妻]->(b) return r;
MATCH (a:pig{
     name:"猪爸爸"}) match (b:pig{
     name:"猪爷爷"}) create (b)-[r:父子]->(a) return r
MATCH (a:pig{
     name:"猪爸爸"}) match (b:pig{
     name:"猪奶奶"}) create (b)-[r:母子]->(a) return r
MATCH (a:pig{
     name:"猪爸爸"}) match (b:pig{
     name:"佩奇"}) create (a)-[r:父女]->(b) return r;
MATCH (a:pig{
     name:"猪爷爷"}) match (b:pig{
     name:"佩奇"}) create (a)-[r:孙女]->(b) return r;
MATCH (a:pig{
     name:"猪奶奶"}) match (b:pig{
     name:"佩奇"}) create (a)-[r:孙女]->(b) return r; //3.创建关系加节点
CREATE (:pig{
     name:“猪爸爸",age:12})-[:夫妻{age:5}]->(:pig{name:"猪妈妈",age:9})
CREATE (:pig{
     name:“佩奇",age:5})-[:姐弟]->(:pig{name:"乔治",age:3})
//4.修改属性
MATCH (a:pig{
     name:"猪爸爸",age:12}) set a.age=5;
//5.创建多标签节点
CREATE (a:pig:die{
     name:"猪祖父",age:12}) return a.name; 
//6.删除节点
MATCH (n:die) delete n; 
//7.查询所有的关系
return (:pig{
     name:"佩奇"})-->() limit 5 

创建完成后,关系图如下所示:
图数据库-复杂关系型数据的查询优化_第1张图片

四、Neo4j程序开发

    neo4j是原生库,所以相关系统功能如数据同步、容灾备份等API,需要自己用具体的编程语言去实现和完善。RESTAPI文档: https://neo4j.com/docs/rest-docs/current
图数据库-复杂关系型数据的查询优化_第2张图片

五、复杂关系型数据的查询优化

1. 优化前查询逻辑

2. 优化后查询逻辑

七、参考文献

  1. https://toutiao.io/posts/8a87lh/preview

你可能感兴趣的:(大数据)