当前位置: 首页 > news >正文

微澜:用 OceanBase 搭建基于知识图谱的实时资讯流的应用实践

本文作者: 北京深鉴智源科技有限公司架构师  郑荣凯

本文整理自北京深鉴智源科技有限公司架构师郑荣凯,在《深入浅出 OceanBase 第四期》的分享。


知识图谱是一项综合性的系统工程,需要在在各种应用场景中向用户展示经过分页的一度关系。

微澜是一款用于查询技术、行业、企业、科研机构、学科及其关系的知识图谱应用,具有十亿级实体以及百亿级关系。在我们公司的业务场景中,在数据上存在若干超级节点,这些节点是实用户访问概率极高的关键节点,因此,它们并不应被轻易地视为长尾问题的范畴。又因为我们当前的用户基数相对有限,遇到缓存的频率较低,因此我们需要一套解决方案来降低用户的查询延迟。

为了解决这个的业务痛点,微澜通过在知识图谱中引入OceanBase,突破了技术挑战,完美地在新闻资讯体系中搭建起了自己独有的体系,有效保证了信息的速度以及信息的可溯源与真实可靠。

一、微澜用知识图谱做了什么?

微澜由北京深鉴智源科技有限公司出品,是基于人工智能的个人认知提升助手(PCA)及创新的外部知识管理工具,有助于启发及解决工作、学习及生活中的有效选择及效率问题;打破“信息茧房”,消除“内卷”。

微澜在知识架构上增加了新闻资讯的架构。假如用户关注了某公司,系统会持续推送有关该公司的新闻,以及与这条新闻相关的实体。

二、为什么选择知识图谱?

微澜的客户一般在行业上游,挖掘商业逻辑。所以客户需要的信息相对比较宏观,需要更大的知识图谱,更多的实体承载这个架构。微澜的客户注重平衡“特殊”与“一般”。客户既要普适的结论也需要一些特殊性的结果,从而观察相关领域的风险以及机遇。与此同时,微澜的客户注重因果推断,他们希望所有的数据、结论能够溯源。

大卫休谟曾经说过:“运用归纳法的正当性,永远不可能从理性上被证明。”如果采用归纳法,归纳以往的数据、经验、结论,用这些数据推断未来的可能性,这件事情永远不可能在理性上被证明。

Inductive Reasoning(归纳推理)是从观察到的现象得出的一个结论,一个原则。假设看到的所有羊都是白的,利用 Inductive Reasoning (归纳推理)总结羊一定全都是白色的。

Deductive Reasoning(演绎推理)是已经知道一个原则,利用这个原则去预测看到的现象。假设一个定律是所有的乌龟都有壳。现在出现一个乌龟,就可以预料到这个乌龟一定也有壳。

思想关系与事实之间的区别,通常被称为“休谟之叉”,即 Hume's Fork 。通常带有负面暗示,即休谟可能非法排除了不适合这两个类别或同时适合这两个类别的有意义的命题。

休谟对知识的二分法被称为“休谟之叉”,是后来西方哲学认识论中分析命题和综合命题划分的先导。从“休谟之叉”又可以推出诸多不同标准下的知识,如先天的和后天的知识、分析的和综合的知识、必然的和偶然的知识,而这些知识的区分标准都已被“休谟之叉”点破。

以苹果公司为例,它存在着四万多个核心技术,所有的核心技术都可以在微澜溯源。

微澜发的新闻架构是基于知识图谱扩展的。实体一和实体二之间有关系,所以实体一关的新闻与实体二的新闻,也有潜在关系。

如上图所示,一个实体连着三条新闻,在不同的时间,发生了这三条新闻。所以微澜可以组成关于这个实体新闻流的时间线,便于用户理解实体发展的商业过程。

在微澜的知识图谱业务中,很多场景需要展示复杂的关系。同时,微澜的数据中存在一些超级节点,根据微澜的业务场景,超级节点是用户最可能访问的节点。

所以超级节点不能被简单归类到长尾问题。

某个机构在某领域的排名特别高,但在全局或者其他领域一般。在这种场景下,微澜必须显示排序属性,并且对于全局排序项,进行拟合标准化,使每个维度的数据方差都为1,均值都为0,以便用户进行局部排序,方便用户查询。

三、为什么要在知识图谱中加入 NewSQL ?

为了解决上述问题,微澜在知识图谱中加入 NewSQL ,把图中的一度关系问题转化为传统RDBMS中的联合主键即可解决图数据库中海量数据排序下推的问题。

对于初创企业而言,在数据量大的情况下, NewSQL 的运维成本和件成本都很低。

传统DBMS容错方案的重点是保障数据更新不会丢失。 NewSQL 除了这点以外,还能最小化停机时间,使其一直保持应用在线。

四、 NewSQL 在微澜的系统中如何选型?

微澜有30亿的 records 数据,但没有复杂分库分表的运维能力。而 ScyllaDB 无法适应新业务的查询要求,所以微澜需要一个能实现传统 RDBMS 的 query 功能的数据库。

除此之外,微澜需要进行周期性的大量写入。所以微澜 在OceanBase , TiDB , CockroachDB 之间选型。

Tikv 采用 Range 的方式分区,但微澜更需要 hash 的分区方式,因为微澜的业务更偏向于单点查询而非范围查询,写入速度比较慢,无法适应微澜周期性的大量写入的业务场景

CockroachDB(小强数据库)是 PG 型数据库,团队之前接触的比较少,对于单表的数据量支持一般,不符合业务需求。

OceanBase 有优秀的写入能力,支持 hash 分区策略。对于单表大数据量的支撑强而有力,有良好的社区支持,支持 B tree 索引策略复合业务。对于 Paxos 的极致应用使得任务的并行粒度很细,可以把性能尽可能发挥出来。

经过综合考虑,微澜最终选择使用 OceanBas e。在微澜的所有业务中,微澜选择使用 OceanBase 来存储图谱中所有的一度关系。图数据库无法覆盖的海量关系查询排序已经被完美解决。

对比之前微澜使用的 ScyllaDB ,作为 NewSQL 的 OceanBase ,自然比 NoSQL 数据库能覆盖更多的业务场景,比如多个条件的筛选并排序。现在微澜两周一次30亿 records 的数据更新已经在 OceanBase 上被验证了很多次,可以适配微澜的业务需求。

微澜采用推送架构而不是拉取架构,类似于微博给千万级大V单独建表推送给关注者的逻辑,用户不管是关注数个百万级新闻的实体还是只关注单个新闻数量很少的实体得到消息推送的速度都基本一致。

五、微澜如何实现?

微澜的业务架构,如上图所示。首先,用户在后端,关注一个实体。然后,微澜关联到实体 ID ,在用户资讯表,关联 ID 的新闻。最后,写入用户资讯表,将新闻展示给用户。

相比传统的资讯平台,由于知识图谱的加入并且与新闻深度耦合,可以扩展更多。比如针对某实体的新闻时间线,查询两条新闻之间的关系以及获取领域交叉等功能。

知识图谱采用演绎法而非传统技术分析的归纳法,推理结果保证是存在的事实而非通过分析得到的推论,领域交叉运算可溯源且真实可靠。


附录、用户问答

问:现在的集群规模有多大?

答:微澜只有三台机器。

问:这些模型是固定好的?还是根据即时需求生成的?

答:大部分是固定好的。如果客户对微澜提出了新的需求,微澜再生产新的功能,满足相关的需求。

问:你们怎样控制合并机制?

答:在业务方,手动合并。目前微澜还没有完全解决合并问题,但现在可以正常运行。

问: OceanBase 在知识图谱的用法,可以复制到类似的业务场景下吗?这种场景有什么突出的特点?

答:原生的存储数据的形式不具有排序功能。 OceanBase 可以索引,做更多复杂的业务。

相关文章:

微澜:用 OceanBase 搭建基于知识图谱的实时资讯流的应用实践

本文作者: 北京深鉴智源科技有限公司架构师 郑荣凯 本文整理自北京深鉴智源科技有限公司架构师郑荣凯,在《深入浅出 OceanBase 第四期》的分享。 知识图谱是一项综合性的系统工程,需要在在各种应用场景中向用户展示经过分页的一度关系。 微…...

【LeetCode】【算法】538. 把二叉搜索树转换为累加树

LeetCode 538. 把二叉搜索树转换为累加树 题目 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下…...

YoloV8改进策略:注意力改进|EPSANet,卷积神经网络上的高效金字塔挤压注意力块|即插即用|代码+改进方法

摘要 论文介绍 本文介绍的论文是“EPSANet:卷积神经网络上的高效金字塔挤压注意力块”,该论文提出了一种新颖、轻量且有效的注意力方法,即金字塔挤压注意力(PSA)模块。论文通过替换ResNet瓶颈块中的 3 3 3 \times 3 3...

Nextflow最佳实践:如何在云上高效处理大规模数据集

1. Nextflow 软件架构介绍 Nextflow 是一个用于简化数据驱动计算流程的工具,可以在各种计算环境中轻松部署。它采用了分布式计算和容器技术,实现了高度模块化、可重复性和可扩展性。NextFlow 的软件架构主要包括以下几个部分: 用户界面&…...

数据结构:顺序表(动态顺序表)

专栏说明:本专栏用于数据结构复习,文章中出现的代码由C语言实现,在专栏中会涉及到部分OJ题目,如对你学习有所帮助,可以点赞鼓励一下博主喔💓 博客主页:Duck Bro 博客主页系列专栏:数…...

springboot040社区医院信息平台

🍅点赞收藏关注 → 添加文档最下方联系方式领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅 项目视频 spr…...

windows下QT5.12.11使用MSVC编译器编译mysql驱动并使用详解

1、下载mysql开发库,后面驱动编译的时候需要引用到,下载地址:mysql开发库下载 2、使用everything搜索:msvc-version.conf,用记事本打开,添加:QMAKE_MSC_VER=1909。不然msvc下的mysql源码加载不上。...

c++写一个死锁并且自己解锁

刷算法题: 第一遍:1.看5分钟,没思路看题解 2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…...

JavaScript方法修改 input type=file 样式

html中的<input type "file">的样式很难修改&#xff0c;又跟页面风格很不匹配。我就尝试了几种方法&#xff0c;但是不管是用label还是用opacity:0都很麻烦&#xff0c;还老是出问题&#xff0c;所以最后还是用JavaScript来解决。 下面附上代码&#xff1a;…...

群控系统服务端开发模式-应用开发-前端个人信息功能

个人信息功能我把他分为了3部分&#xff1a;第一部分是展示登录者信息&#xff1b;第二步就是登录者登录退出信息&#xff1b;第三部分就是修改个人资料。 一、展示登录者信息 1、优先添加固定路由 在根目录下src文件夹下route文件夹下index.js文件中&#xff0c;添加如下代码 …...

【jupyter】文件路径的更改

使用过 jupyter notebook 环境的同行&#xff0c; 都体会过随机生成 .html 静态网页的过程&#xff0c; 虽然文档较小&#xff0c; 但是不堪反复使用积少成多。本文基于windows系统。 找到 runtime 目录 一般 jupyter 默认 runtime 在下述格式目录中 C:\Users\用户名\AppData…...

Ruby编程语言全景解析:从基础到进阶

Ruby是一种动态的、面向对象的编程语言&#xff0c;以其优雅的语法和强大的功能而闻名于世。自从1995年由日本程序员松本行弘&#xff08;Yukihiro Matsumoto&#xff09;发布以来&#xff0c;Ruby便迅速成为了开发者中颇受欢迎的编程语言之一。无论是构建简单的脚本还是复杂的…...

Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)

作者&#xff1a;来自 Elastic Ranjana Devaji, Dana Juratoni Elasticsearch 8.16 引入了 BBQ&#xff08;Better Binary Quantization - 更好的二进制量化&#xff09;—— 一种压缩向量化数据的创新方法&#xff0c;其性能优于传统方法&#xff0c;例如乘积量化 (Product Qu…...

解决vscode不能像pycharm一样从其他同级文件夹导包

在vscode中选择&#xff1a;文件-首选项-设置-扩展-Python-settings.json 向setting.json添加如下代码: "terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceFolder}/",},"terminal.integrated.env.linux": {"PYTHON…...

DAY24|回溯算法Part03|LeetCode:93.复原IP地址、78.子集、90.子集II

目录 LeetCode:93.复原IP地址 基本思路 C代码 LeetCode:78.子集 基本思路 C代码 LeetCode:90.子集II 基本思路 C代码 通过used实现去重 通过set实现去重 不使用used和set版本 LeetCode:93.复原IP地址 力扣代码链接 文字讲解&#xff1a;LeetCode:93.复原IP地…...

接口自动化测试做到什么程度的覆盖算是合格的

接口自动化测试的覆盖程度是一个衡量测试质量与效率的重要指标&#xff0c;其“好”的标准并非绝对&#xff0c;而是根据项目特性和团队需求动态调整的结果。然而&#xff0c;有几个原则和实践可以帮助我们确定一个相对合理的覆盖范围&#xff0c;以及为何这些覆盖是必要的。 1…...

Kubernetes-ArgoCD篇-01-简介

1、什么是Argo CD Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。 Argo CD官方文档地址&#xff1a;https://argo-cd.readthedocs.io Argo CD源码地址&#xff1a;https://github.com/argoproj/argo-cd 1.1 关于Argo Argo是一个开源的项目&#xff0c;主要是扩…...

阿里云通义大模型团队开源Qwen2.5-Coder:AI编程新纪元

&#x1f680; 11月12日&#xff0c;阿里云通义大模型团队宣布开源通义千问代码模型全系列&#xff0c;共6款Qwen2.5-Coder模型。这些模型在同等尺寸下均取得了业界最佳效果&#xff0c;其中32B尺寸的旗舰代码模型在十余项基准评测中均取得开源最佳成绩&#xff0c;成为全球最强…...

【大数据学习 | HBASE高级】hbase的参数优化

Zookeeper 会话超时时间 属性&#xff1a;zookeeper.session.timeout 解释&#xff1a;默认值为 90000 毫秒&#xff08;90s&#xff09; hbase.client.pause&#xff08;默认值 100ms&#xff09;重试间隔 hbase.client.retries.number&#xff08;默认 15 次&#xff09;重试…...

两个链表求并集、交集、差集

两个链表求并集、交集、差集 两个链表求并集、交集、差集其实都是创建一个新链表然后遍历插入的题型&#xff0c;所以下边就举并集一个例子。 首先将l1里的所有节点遍历存储到新节点l中开始遍历l2,如果l中不存在l2中的节点就将其尾插到l中 下面是两个链表求并集、交集、差集的代…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

VSCode 使用CMake 构建 Qt 5 窗口程序

首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...

【笔记】结合 Conda任意创建和配置不同 Python 版本的双轨隔离的 Poetry 虚拟环境

如何结合 Conda 任意创建和配置不同 Python 版本的双轨隔离的Poetry 虚拟环境&#xff1f; 在 Python 开发中&#xff0c;为不同项目配置独立且适配的虚拟环境至关重要。结合 Conda 和 Poetry 工具&#xff0c;能高效创建不同 Python 版本的 Poetry 虚拟环境&#xff0c;接下来…...

【向量库】Weaviate概述与架构解析

文章目录 一、什么是weaviate二、High-Level Architecture1. Core Components2. Storage Layer3. 组件交互流程 三、核心组件1. API Layer2. Schema Management3. Vector Indexing3.1. 查询原理3.2. 左侧&#xff1a;Search Process&#xff08;搜索流程&#xff09;3.3. 右侧&…...