图数据库与传统数仓实现联邦查询
图数据库与传统数仓实现联邦查询
- 使用CYPHER实现从关系数据库过滤时间序列指标
- 一、MySQL得到研报实体在Oracle中的唯一ID
- 二、Oracle中过滤时间序列数据
- 三、CYPHER实现MySQL和Oracle查询语句串联
- 四、通过`apoc.case`实现布尔值的判断
- 五、将查询封装为函数
- 六、将函数运用在数据过滤查询中
- 七、总结
Here’s the table of contents:
使用CYPHER实现从关系数据库过滤时间序列指标
本文中涉及的图数据模型主要是研报相关的数据,对研报数据分词之后得到关键词的数据,模型路径为
(股票)<-[涉及]-(研报)-[包含]->(关键词)
。在建立起股票
、研报
、关键词
数据网络之后,需要通过研报的撰写时间过滤出相关股票
和关键词数据
。其中研报实体本身相关的时间序列数据存储在MySQL和Oracle中,通过研报的唯一ID实现不同存储中的数据关联。
一、MySQL得到研报实体在Oracle中的唯一ID
图库中保存的研报实体只有
code
和name
两个属性,在关联时需要用该code
在MySQL中拿到关联Oracle的ID,因此有了下面这个SQL语句。其中,为了保证在MySQL没有命中数据时CYPHER也能有连贯的数据传递操作,在SQL中加入了一个固定默认值的输出操作。
二、Oracle中过滤时间序列数据
在
一
中得到ID之后,从Oracle中过滤时序指标,同样为了保证在Oracle没有命中数据时CYPHER也能有连贯的数据传递操作,在SQL中加入了一个固定默认值的输出操作。
三、CYPHER实现MySQL和Oracle查询语句串联
使用CYPHER实现对MySQL和Oracle查询语句的串联,并保证数据的连续性。
四、通过apoc.case
实现布尔值的判断
使用
apoc.case
过程,实现对SQL返回值结果的逻辑判断,并重定向数据结果为一个布尔值,返回布尔值是因为在后续的图数据路径过滤中会依赖该查询使用布尔值做判断。
五、将查询封装为函数
为了方便在后续的CYPHER中调用
四
中复杂的查询,将四
中的查询封装为一个CYPHER函数。
六、将函数运用在数据过滤查询中
通过一系列的查询下推拆分在
一到五
节中,实现了复杂查询的封装,在应用这个时序指标过滤函数时就可以方便地调用。下面的查询实现了对20060902000000
到20210902000000
之间撰写的研报数据关联网络的过滤。
- 查看执行效率【查询100条路径耗时100ms】
七、总结
在本文中可以看到,数据架构中拆分了时序指标数据和关联网络,这样的做法可以尽可能节省
图数据
库单节点服务器的硬盘存储资源
,使得一台服务器可以存储更多的关联网络;同时,充分利用了数仓
的存储资源
和计算资源
。但是这种架构方式,启用了更多的网络查询消耗
,和本地存储方式相比会多消耗一些时间资源。在实际跑模型中,可以根据实际场景优化查询。将查询较多的属性数据存放在图库中,可以减少网络消耗;时序数据可以用JSON串保存在属性中,使用存储过程过滤。