图数据库-复杂关系型数据的查询优化
一、背景
关系型数据库在处理以下几个问题时往往会显得捉襟见肘:
- 关联查询中涉及到的关系可能会经常性的变化、增加、修改、或者删除。更新其中一种关系时需要及时更新与之相关的其他关系,需要消耗额外的人力去记录所有的关联关系,以保证状态数据更新时不出错。例如,某个落地页实体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}) re