热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图数据库与传统数仓实现联邦查询

图数据库与传统数仓实现联邦查询使用CYPHER实现从关系数据库过滤时间序列指标一、MySQL得到研报实体在Oracle中的唯一ID二、Oracle中过滤时间序列数据三、CYPHER

图数据库与传统数仓实现联邦查询

  • 使用CYPHER实现从关系数据库过滤时间序列指标
    • 一、MySQL得到研报实体在Oracle中的唯一ID
    • 二、Oracle中过滤时间序列数据
    • 三、CYPHER实现MySQL和Oracle查询语句串联
    • 四、通过`apoc.case`实现布尔值的判断
    • 五、将查询封装为函数
    • 六、将函数运用在数据过滤查询中
    • 七、总结



Here’s the table of contents:
使用CYPHER实现从关系数据库过滤时间序列指标

    本文中涉及的图数据模型主要是研报相关的数据&#xff0c;对研报数据分词之后得到关键词的数据&#xff0c;模型路径为(股票)<-[涉及]-(研报)-[包含]->(关键词)。在建立起股票研报关键词数据网络之后&#xff0c;需要通过研报的撰写时间过滤出相关股票关键词数据。其中研报实体本身相关的时间序列数据存储在MySQL和Oracle中&#xff0c;通过研报的唯一ID实现不同存储中的数据关联。


一、MySQL得到研报实体在Oracle中的唯一ID


    图库中保存的研报实体只有codename两个属性&#xff0c;在关联时需要用该code在MySQL中拿到关联Oracle的ID&#xff0c;因此有了下面这个SQL语句。其中&#xff0c;为了保证在MySQL没有命中数据时CYPHER也能有连贯的数据传递操作&#xff0c;在SQL中加入了一个固定默认值的输出操作。

SELECT zyyx_yanbao_code FROM (SELECT zyyx_yanbao_code FROM ZYYX_YANBAO WHERE yanbao_hcode&#61;&#39;HDOCec613f2d8b707b66a8edc8c1eaeb29f0&#39; UNION SELECT zyyx_yanbao_code FROM ZYYX_YANBAO_old WHERE yanbao_hcode&#61;&#39;HDOCec613f2d8b707b66a8edc8c1eaeb29f0&#39; UNION SELECT -1 AS ZYYX_YANBAO)AS a ORDER BY zyyx_yanbao_code ASC LIMIT 2

二、Oracle中过滤时间序列数据


    在中得到ID之后&#xff0c;从Oracle中过滤时序指标&#xff0c;同样为了保证在Oracle没有命中数据时CYPHER也能有连贯的数据传递操作&#xff0c;在SQL中加入了一个固定默认值的输出操作。

SELECT rownum rm, a.* FROM (SELECT REPORT_ID FROM (SELECT REPORT_ID FROM ODSZYYX.RPT_FORECAST_STK WHERE REPORT_ID&#61;&#39;1359506&#39; AND CREATE_DATE BETWEEN TO_DATE(20170902000000,&#39;YYYY-MM-DD HH24:MI:SS&#39;) AND TO_DATE(20210902000000,&#39;YYYY-MM-DD HH24:MI:SS&#39;) UNION SELECT -1 AS REPORT_ID FROM (SELECT rownum rm, a.* FROM ( SELECT REPORT_ID FROM ODSZYYX.RPT_FORECAST_STK) a WHERE rownum <&#61; 1 ) b WHERE b.rm > 0) a) a WHERE rownum <&#61; 2 ORDER BY REPORT_ID ASC

三、CYPHER实现MySQL和Oracle查询语句串联


    使用CYPHER实现对MySQL和Oracle查询语句的串联&#xff0c;并保证数据的连续性。

// 查询MySQL
CALL apoc.load.jdbc(&#39;jdbc:mysql://datalab-contentdb-dev.crkldnwly6ki.rds.cn-north-1.amazonaws.com.cn:3306/test?user&#61;dev&password&#61;test&useUnicode&#61;true&characterEncoding&#61;utf8&serverTimezone&#61;UTC&#39;,
&#39;SELECT zyyx_yanbao_code FROM (SELECT zyyx_yanbao_code FROM ZYYX_YANBAO WHERE yanbao_hcode&#61;? UNION SELECT zyyx_yanbao_code FROM ZYYX_YANBAO_old WHERE yanbao_hcode&#61;? UNION SELECT -1 AS ZYYX_YANBAO) AS a ORDER BY zyyx_yanbao_code ASC LIMIT 2&#39;,
[&#39;HDOCec613f2d8b707b66a8edc8c1eaeb29f0&#39;,&#39;HDOCec613f2d8b707b66a8edc8c1eaeb29f0&#39;])
YIELD row WITH row.zyyx_yanbao_code AS zyyx_yanbao_code
// 查询Oracle
CALL apoc.load.jdbc(&#39;jdbc:oracle:thin:ngdp/test&#64;ngdpdb-sync-prod.crkldnwly6ki.rds.cn-north-1.amazonaws.com.cn:1521/ORCL&#39;,
&#39;SELECT rownum rm, a.* FROM (SELECT REPORT_ID FROM (SELECT REPORT_ID FROM TEST.RPT_FORECAST_STK WHERE REPORT_ID&#61;? AND CREATE_DATE BETWEEN TO_DATE(?,\&#39;YYYY-MM-DD HH24:MI:SS\&#39;) AND TO_DATE(?,\&#39;YYYY-MM-DD HH24:MI:SS\&#39;) UNION SELECT -1 AS REPORT_ID FROM (SELECT rownum rm, a.* FROM ( SELECT REPORT_ID FROM ODSZYYX.RPT_FORECAST_STK) a WHERE rownum <&#61; 1 ) b WHERE b.rm > 0) a) a WHERE rownum <&#61; 2 ORDER BY REPORT_ID ASC&#39;,
[zyyx_yanbao_code,20170902000000,20210902000000])
YIELD row RETURN row

四、通过apoc.case实现布尔值的判断


    使用apoc.case过程&#xff0c;实现对SQL返回值结果的逻辑判断&#xff0c;并重定向数据结果为一个布尔值&#xff0c;返回布尔值是因为在后续的图数据路径过滤中会依赖该查询使用布尔值做判断。

// 查询MySQL
CALL apoc.load.jdbc(&#39;jdbc:mysql://datalab-contentdb-dev.crkldnwly6ki.rds.cn-north-1.amazonaws.com.cn:3306/test?user&#61;dev&password&#61;test&useUnicode&#61;true&characterEncoding&#61;utf8&serverTimezone&#61;UTC&#39;,
&#39;SELECT zyyx_yanbao_code FROM (SELECT zyyx_yanbao_code FROM ZYYX_YANBAO WHERE yanbao_hcode&#61;? UNION SELECT zyyx_yanbao_code FROM ZYYX_YANBAO_old WHERE yanbao_hcode&#61;? UNION SELECT -1 AS ZYYX_YANBAO) AS a ORDER BY zyyx_yanbao_code ASC LIMIT 2&#39;,
[&#39;HDOCec613f2d8b707b66a8edc8c1eaeb29f0&#39;,&#39;HDOCec613f2d8b707b66a8edc8c1eaeb29f0&#39;])
YIELD row WITH row.zyyx_yanbao_code AS zyyx_yanbao_code
// 查询Oracle
CALL apoc.load.jdbc(&#39;jdbc:oracle:thin:ngdp/test&#64;ngdpdb-sync-prod.crkldnwly6ki.rds.cn-north-1.amazonaws.com.cn:1521/ORCL&#39;,
&#39;SELECT rownum rm, a.* FROM (SELECT REPORT_ID FROM (SELECT REPORT_ID FROM TEST.RPT_FORECAST_STK WHERE REPORT_ID&#61;? AND CREATE_DATE BETWEEN TO_DATE(?,\&#39;YYYY-MM-DD HH24:MI:SS\&#39;) AND TO_DATE(?,\&#39;YYYY-MM-DD HH24:MI:SS\&#39;) UNION SELECT -1 AS REPORT_ID FROM (SELECT rownum rm, a.* FROM ( SELECT REPORT_ID FROM ODSZYYX.RPT_FORECAST_STK) a WHERE rownum <&#61; 1 ) b WHERE b.rm > 0) a) a WHERE rownum <&#61; 2 ORDER BY REPORT_ID ASC&#39;,
[zyyx_yanbao_code,20170902000000,20210902000000])
YIELD row WITH row
WITH COLLECT(row.REPORT_ID) AS REPORT_ID_LIST
WITH [REPORT_ID IN REPORT_ID_LIST WHERE REPORT_ID<>&#39;-1&#39;] AS RE_REPORT_ID_LIST
CALL apoc.case([RE_REPORT_ID_LIST<>[],&#39;RETURN TRUE AS bool&#39;],&#39;RETURN FALSE AS bool&#39;
)
YIELD value
RETURN value.bool AS bool

五、将查询封装为函数


    为了方便在后续的CYPHER中调用中复杂的查询&#xff0c;将中的查询封装为一个CYPHER函数。

CALL apoc.custom.asFunction(&#39;yanbaoHcode.createDate.range.bool&#39;,&#39;CALL apoc.load.jdbc(\&#39;jdbc:mysql://datalab-contentdb-dev.crkldnwly6ki.rds.cn-north-1.amazonaws.com.cn:3306/analytics_graph_data?user&#61;dev&password&#61;datalabgogo&useUnicode&#61;true&characterEncoding&#61;utf8&serverTimezone&#61;UTC\&#39;, \&#39;SELECT zyyx_yanbao_code FROM (SELECT zyyx_yanbao_code FROM ZYYX_YANBAO WHERE yanbao_hcode&#61;? UNION SELECT zyyx_yanbao_code FROM ZYYX_YANBAO_old WHERE yanbao_hcode&#61;? UNION SELECT -1 AS ZYYX_YANBAO) AS a ORDER BY zyyx_yanbao_code ASC LIMIT 2\&#39;,[$yanban_hcode,$yanban_hcode]) YIELD row WITH row.zyyx_yanbao_code AS zyyx_yanbao_code CALL apoc.load.jdbc(\&#39;jdbc:oracle:thin:ngdp/datalabgogo&#64;ngdpdb-sync-prod.crkldnwly6ki.rds.cn-north-1.amazonaws.com.cn:1521/ORCL\&#39;, \&#39;SELECT rownum rm, a.* FROM (SELECT REPORT_ID FROM (SELECT REPORT_ID FROM ODSZYYX.RPT_FORECAST_STK WHERE REPORT_ID&#61;? AND CREATE_DATE BETWEEN TO_DATE(?,\\\&#39;YYYY-MM-DD HH24:MI:SS\\\&#39;) AND TO_DATE(?,\\\&#39;YYYY-MM-DD HH24:MI:SS\\\&#39;) UNION SELECT -1 AS REPORT_ID FROM (SELECT rownum rm, a.* FROM ( SELECT REPORT_ID FROM ODSZYYX.RPT_FORECAST_STK) a WHERE rownum <&#61; 1 ) b WHERE b.rm > 0) a) a WHERE rownum <&#61; 2 ORDER BY REPORT_ID ASC\&#39;,[zyyx_yanbao_code,$create_date_start,$create_date_stop]) YIELD row WITH row WITH COLLECT(row.REPORT_ID) AS REPORT_ID_LIST WITH [REPORT_ID IN REPORT_ID_LIST WHERE REPORT_ID<>\&#39;-1\&#39;] AS RE_REPORT_ID_LIST CALL apoc.case([RE_REPORT_ID_LIST<>[],\&#39;RETURN TRUE AS bool\&#39;],\&#39;RETURN FALSE AS bool\&#39;) YIELD value RETURN value.bool AS bool&#39;,&#39;BOOLEAN&#39;,[[&#39;yanban_hcode&#39;,&#39;STRING&#39;],[&#39;create_date_start&#39;,&#39;LONG&#39;],[&#39;create_date_stop&#39;,&#39;LONG&#39;]],false,&#39;通过判断研报撰写日期返回FALSE或者TRUE【结果集大于0返回TRUE】【时间范围左闭右闭】&#39;
);

六、将函数运用在数据过滤查询中


    通过一系列的查询下推拆分在一到五节中&#xff0c;实现了复杂查询的封装&#xff0c;在应用这个时序指标过滤函数时就可以方便地调用。下面的查询实现了对2006090200000020210902000000之间撰写的研报数据关联网络的过滤。

MATCH p&#61;(n:股票)<-[:涉及]-(c:研报)-[r:包含]->(k:关键词)WHERE custom.yanbaoHcode.createDate.range.bool(c.hcode,20060902000000,20210902000000)RETURN k.name AS keyword, r.weight AS weight LIMIT 10

  • 查看执行效率【查询100条路径耗时100ms】
    在这里插入图片描述

七、总结


    在本文中可以看到&#xff0c;数据架构中拆分了时序指标数据和关联网络&#xff0c;这样的做法可以尽可能节省图数据库单节点服务器的硬盘存储资源&#xff0c;使得一台服务器可以存储更多的关联网络&#xff1b;同时&#xff0c;充分利用了数仓存储资源计算资源。但是这种架构方式&#xff0c;启用了更多的网络查询消耗&#xff0c;和本地存储方式相比会多消耗一些时间资源。在实际跑模型中&#xff0c;可以根据实际场景优化查询。将查询较多的属性数据存放在图库中&#xff0c;可以减少网络消耗&#xff1b;时序数据可以用JSON串保存在属性中&#xff0c;使用存储过程过滤。


推荐阅读
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 如何在PostgreSQL中查看数据表
    本文将指导您使用pgAdmin工具连接到PostgreSQL数据库,并展示如何浏览和查找其中的数据表。通过简单的步骤,您可以轻松访问所需的表结构和数据。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
author-avatar
JohnBeanLee
A PHP Coder
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有