目录

  • 子结构学习的引言
  • 相关工作的回顾
    • 药物的表示
    • DDI预测
  • 方法
    • 问题描述
    • 门限消息传递网络提取子结构
    • DDI预测的过程
  • 结果

子结构学习的引言

药物化学的理论表明,药物是一个简单的实体,其由不同的官能团(或者化学子结构)组成,这些子结构决定了药代动力学特性(生物体如何处理它)和药效学特性(它如何影响生物体),以及最终的交互反应。为此,研究人员提出了基于子结构学习的DDI预测方法。

  • 首先,药物在分子图表示的基础上被表示成一个graph,为了从药物的graph中提取子结构,作者提出一个消息传递网络,其中,边具有可学习的权重,权重值约束在0到1之间。这些权重可以被认为是划分子结构的门限(gates),具有产生灵活尺寸和不规则形状子结构的效果。
  • 其次,两种药物之间的 DDI 预测是基于它们学习到的子结构之间的相互作用分数,每个相互作用分数都使用共同注意机制(co-attention)由可学习的权重加权得到。对于副产物,作者提出的方法可以提示哪些子结构可能是导致 DDI 发生的原因。
  • 最后,作者在两个数据集上评估了方法:1.Drugbank数据集,包含药物1704种,191808个DDI对(DDI pairs),86种反应类型;2.Twosides数据集,645种药物,4649441个DDI对,1317种反应类型。
    实验在两种设置下进行,一种是transductive,DDI对的训练和测试集共享相同的药物;另一种是inductive(也称为冷启动),测试集和训练集中的药物是不同的(测试集里的药物不在训练集中出现,训练集中的药物也不在测试集中出现)。Inductive更困难更具挑战性。
    两个数据集都被使用到transductive设置中,对于inductive设置,只使用Drugbank进行实验。

相关工作的回顾

相关工作主要是回顾以往的DDI预测任务的两个方面:1.药物是如何表示的;2.实际预测是如何进行的。

药物的表示

过去大多数DDI预测方法都是利用分子指纹表示药物,或者是其他的药物概况,比如副作用,结合靶标,转运蛋白,酶,通路或这些特征中的两个或多个的组合。分子指纹是二进制向量,其元素表示特定化学子结构的存在 (1) 或不存在 (0)。药物概况类似地表示为二进制向量,表示特定概况的存在或不存在,例如,特定的副作用或结合靶标。

一些方法通过将药物表示为相似性向量来执行进一步的预处理,该向量使用相似性度量(例如余弦相似性,Jaccard similiart)表示它与同一表示空间下的其他药物的相似程度。这是由相似/不同的药物可能具有相似/不同的生物活性的假设指导的。这种表达的缺点是它们是人工设计的,受限于专家的知识水平,缺乏可扩展性,不能编码新的药物。

近年来,GNN被用于化学分子的可学习表示,并提高了分子相关任务的性能。然而,在不过多考虑DDI主要因素(官能团或化学子结构)情况下,这种方法通常用于表示一个整体的药物。最近的一些方法在DDI中考虑了子结构信息。然而,节点在每个GNN层的隐层表达被离散地视为药物的子结构。这种方法产生的子结构形状规则,其大小由GNN的层数以及感受野决定(比如SSI-DDI)。

DDI预测

预测DDI的方法可以分为两类:一类是药物来自于知识图谱,另一类是药物被认为是相互独立的。在后者,通常我们将两个药物的表达进行聚合(求和或者拼接),然后使用分类器进行预测。对于network based方法(第一类),假设药物形成一个相互连接的系统,其中药物是节点,边表示节点之间的 DDI 或药物之间的相似性。我们通常将不同的图处理方法包括标签传播、矩阵分解、图自编码器应用于这些药物知识图以进行预测或首先学习药物的低维表示,然后执行 DDI 预测。

基于药物知识图的方法可以考虑药物互联系统中的拓扑信息,但是这种方法不能用于inductive设置。作者认为应该把药物考虑为独立的实体才能用于inductive设置下的实验。

方法

方法的整体框架如下图:

给定一个DDI的元组(dx,r,dy)(d_{x},r,d_{y})(dx​,r,dy​),dx,dyd_{x},d_{y}dx​,dy​分别用分子图Gx=(Vx,Ex),Gy=(Vy,Ey)G_{x}=(V_{x},E_{x}),G_{y}=(V_{y},E_{y})Gx​=(Vx​,Ex​),Gy​=(Vy​,Ey​)表示,rrr与可学习的矩阵Mr∈Rb×bM_{r}\in R^{b\times b}Mr​∈Rb×b建立联系,在子结构被提取后,GxG_{x}Gx​生成∣Vx∣|V_{x}|∣Vx​∣个子结构,节点代表每个子结构的中心。GyG_{y}Gy​遵循同样的过程。一个交叉的子结构注意力γij\gamma_{ij}γij​被计算,用于表示子结构之间的相关性。每个子结构都经过线性变换,最终的DDI预测为每对药物dx,dyd_{x},d_{y}dx​,dy​的子结构之间的相互作用得分之和,每对子结构的相互作用的权重为注意力γij\gamma_{ij}γij​。

问题描述

给一个药物集合DDD,一个反应类型集合RRR,DDI预测任务被看作找一个函数fff使得:D×R×D⇒[0,1]D\times R\times D\Rightarrow [0,1]D×R×D⇒[0,1]换言之,给一个包含两个药物和一个具体反应类型的三元组,我们要预测这个DDI事件发生的概率。我们需要找到函数fff使得预测结果与数据集M={(dx,r,dy)i}i=1N⊂D×R×DM=\left\{(d_{x},r,d_{y})_{i}\right\}_{i=1}^{N}\subset D\times R\times DM={(dx​,r,dy​)i​}i=1N​⊂D×R×D近似。

药物被表示为去氢的无向图G=(V,E)G=(V,E)G=(V,E),其中VVV为节点集合,表示原子,E⊂V×VE\subset V\times VE⊂V×V为边集合,表示原子之间的键。每个节点viv_{i}vi​都有一个对应的特征xi∈Rd\textbf{x}_{i}\in R^{d}xi​∈Rd,每个边eij=(vi,vj)e_{ij}=(v_{i},v_{j})eij​=(vi​,vj​)也对应一个向量xij∈Rd′\textbf{x}_{ij}\in R^{d'}xij​∈Rd′,由于初始阶段,边是无向的,所以eij=eji,xij=xjie_{ij}=e_{ji},\textbf{x}_{ij}=\textbf{x}_{ji}eij​=eji​,xij​=xji​。

门限消息传递网络提取子结构

给一个常规的图,以节点viv_{i}vi​为中心的子结构的表达可以看作是所有可到达viv_{i}vi​的节点群的聚合,为了精细表示子结构,我们将图中的边看作门限,即,值在[0,1]的权重。通往节点viv_{i}vi​的路径上的一个节点vjv_{j}vj​的加权值是连接它到viv_{i}vi​的路径上的权值的乘积。

我们假设vjv_{j}vj​到viv_{i}vi​有多条路径,这种情况出现在环状的子图上,我们应该单独考虑每条路径。这里提出的用边值的乘积来衡量节点,最终会产生不同大小和形状的子结构。如果在路径上,有一条边的权重为0,则包含该边的路径权重乘积将为0,代表截断,从而得到不同形状的子结构。

图中的每个节点都可以作为一个子结构的中心,以便从图中提取尽可能多的子结构。这需要将每条边转换成双向边(每个方向都要自己的权重),因为一个节点既可以是目标节点(中心)也可以是源节点。下图是子结构提取的示例。

以图c为例,为了提取以节点v5(红色)为中心的子结构,生成从end-nodes开始到v5结束的所有路径(绿色),例子中,v5有4个end-nodes(v1,v6,v9,v10),即4条路径,在图d中,v5的向量s5表示为四条路径与节点本身的信息聚合。

现在,我们需要把无向的分子图表示G=(V,E)G=(V,E)G=(V,E)转化为有向图,边eije_{ij}eij​和边ejie_{ji}eji​成为两条分开的边。为了突出这个特点,我们重命名为ei→je_{i\rightarrow j}ei→j​和ej→ie_{j\rightarrow i}ej→i​,每个有向边都分配一个可学习的权重,其值在[0,1]内。

对于一个图,上述的路径生成计算效率比较低,为此,作者提出门控消息传递网络G-MPNN模拟这个过程。MPNN是一种多层空间卷积GNN框架,每一层都包括三部分:消息传递,聚合,更新。mj→i(l)=M(l)(hj(l−1),hi(l−1),qj→i),∀j:vj∈N(vi)\textbf{m}_{j\rightarrow i}^{(l)}=M^{(l)}(\textbf{h}_{j}^{(l-1)},\textbf{h}_{i}^{(l-1)},\textbf{q}_{j\rightarrow i}),\forall j:v_{j}\in N(v_{i})mj→i(l)​=M(l)(hj(l−1)​,hi(l−1)​,qj→i​),∀j:vj​∈N(vi​)ai(l)=A(l)({mj→i(l)}j:vj∈N(vi))\textbf{a}_{i}^{(l)}=A^{(l)}(\left\{\textbf{m}_{j\rightarrow i}^{(l)}\right\}_{j:v_{j}\in N(v_{i})})ai(l)​=A(l)({mj→i(l)​}j:vj​∈N(vi​)​)hi(l)=U(l)(hi(l−1),ai(l))\textbf{h}_{i}^{(l)}=U^{(l)}(\textbf{h}_{i}^{(l-1)},\textbf{a}_{i}^{(l)})hi(l)​=U(l)(hi(l−1)​,ai(l)​)其中,hi(l)\textbf{h}_{i}^{(l)}hi(l)​为节点viv_{i}vi​在第lll层的特征,qj→i\textbf{q}_{j\rightarrow i}qj→i​是节点vjv_{j}vj​到viv_{i}vi​的边特征。简而言之,在每次迭代中,节点会从相邻节点传递消息。这样做的效果是,在迭代GNN第lll次时,一个节点将被更新的信息包括了在长度为lll的跳数范围内可到达的所有节点特征。这与子结构提取中沿着路径中节点聚合信息的思想是符合的。图的遍历具有访问节点的冗余(一个节点可以在遍历中出现多次,但在一条路径中最多出现一次,参考上图d),为了更接近图d的路径生成过程,作者使用了directed MPNN,即D-MPNN。为了减少MPNN节点计算的冗余,消息在边之间传递而不是节点之间,D-MPNN包含三个部分:mk→j(l)=M(l)(hk,hj,qk→j(l−1)),∀k:vk∈N(vj)\{vi}\textbf{m}_{k\rightarrow j}^{(l)}=M^{(l)}(\textbf{h}_{k},\textbf{h}_{j},\textbf{q}_{k\rightarrow j}^{(l-1)}),\forall k:v_{k}\in N(v_{j})\backslash\left\{v_{i}\right\}mk→j(l)​=M(l)(hk​,hj​,qk→j(l−1)​),∀k:vk​∈N(vj​)\{vi​}aj→i(l)=A(l)({mk→j(l)}k:vk∈N(vj)\{vi})\textbf{a}_{j\rightarrow i}^{(l)}=A^{(l)}(\left\{\textbf{m}_{k\rightarrow j}^{(l)}\right\}_{k:v_{k}\in N(v_{j})\backslash\left\{v_{i}\right\}})aj→i(l)​=A(l)({mk→j(l)​}k:vk​∈N(vj​)\{vi​}​)qj→i(l)=U(l)(qj→i(l−1),aj→i(l))\textbf{q}_{j\rightarrow i}^{(l)}=U^{(l)}(\textbf{q}_{j\rightarrow i}^{(l-1)},\textbf{a}_{j\rightarrow i}^{(l)})qj→i(l)​=U(l)(qj→i(l−1)​,aj→i(l)​)MPNN和D-MPNN的区别在于前者更新节点特征,后者更新边的特征,比如为了更新边ej→ie_{j\rightarrow i}ej→i​,第一个公式从相邻边ek→je_{k\rightarrow j}ek→j​,其中k:vk∈N(vj)\{vi}k:v_{k}\in N(v_{j})\backslash\left\{v_{i}\right\}k:vk​∈N(vj​)\{vi​},vjv_{j}vj​被视为公共节点。在边特征更新后的最后一次迭代LLL之后,节点被表示为所有进入边特征的集合。比如节点viv_{i}vi​的最终特征si\textbf{s}_{i}si​为:si=∑j:vj∈N(vi)qj→i(L)\textbf{s}_{i}=\sum_{j:v_{j}\in N(v_{i})}\textbf{q}_{j\rightarrow i}^{(L)}si​=j:vj​∈N(vi​)∑​qj→i(L)​现在,给出GMPNN的计算步骤,给一个图G=(V,E)G=(V,E)G=(V,E)表示药物:

  • 对节点特征先进行非线性变换获得新的特征表达:hi=MLPinit_n(xi),∀vi∈V\textbf{h}_{i}=MLP_{init\_n}(\textbf{x}_{i}),\forall v_{i}\in Vhi​=MLPinit_n​(xi​),∀vi​∈V其中,hi∈Rf\textbf{h}_{i}\in R^{f}hi​∈Rf是变换后的节点特征。
  • 边的特征同样经过非线性变换处理:hj→i=MLPinit_e(xji),∀ej→i\textbf{h}_{j\rightarrow i}=MLP_{init\_e}(\textbf{x}_{ji}),\forall e_{j\rightarrow i}hj→i​=MLPinit_e​(xji​),∀ej→i​hi→j=MLPinit_e(xij),∀ei→j\textbf{h}_{i\rightarrow j}=MLP_{init\_e}(\textbf{x}_{ij}),\forall e_{i\rightarrow j}hi→j​=MLPinit_e​(xij​),∀ei→j​其中,hj→i,hi→j∈Rm\textbf{h}_{j\rightarrow i},\textbf{h}_{i\rightarrow j}\in R^{m}hj→i​,hi→j​∈Rm分别是边ej→i,ei→je_{j\rightarrow i},e_{i\rightarrow j}ej→i​,ei→j​的新特征,注意,尽管边ej→i,ei→je_{j\rightarrow i},e_{i\rightarrow j}ej→i​,ei→j​是不同的边,但它们的特征目前是相同的,因为初始无向图限制了xji=xij\textbf{x}_{ji}=\textbf{x}_{ij}xji​=xij​,边ej→ie_{j\rightarrow i}ej→i​的门限wj→i∈[0,1]w_{j\rightarrow i}\in[0,1]wj→i​∈[0,1]是根据关联节点进行初始化的:oj→i=1c(hj→iTMLPw(hj∣∣hi)),wj→i=σ(oj→i)o_{j\rightarrow i}=\frac{1}{c}(\textbf{h}_{j\rightarrow i}^{T}MLP_{w}(\textbf{h}_{j}||\textbf{h}_{i})),w_{j\rightarrow i}=\sigma(o_{j\rightarrow i})oj→i​=c1​(hj→iT​MLPw​(hj​∣∣hi​)),wj→i​=σ(oj→i​)其中,∣∣||∣∣表示拼接,ccc是一个常数。
  • 现在,我们有节点特征hi\textbf{h}_{i}hi​和边的权重wj→iw_{j\rightarrow i}wj→i​,我们应用D-MPNN机制模拟子结构的路径生成。消息在边之间传递而不是节点之间,边ej→ie_{j\rightarrow i}ej→i​的特征表示为:qj→i(0)=wj→ihj\textbf{q}_{j\rightarrow i}^{(0)}=w_{j\rightarrow i}\textbf{h}_{j}qj→i(0)​=wj→i​hj​其中,qj→i(0)∈Rf\textbf{q}_{j\rightarrow i}^{(0)}\in R^{f}qj→i(0)​∈Rf,我们需要与前面提到的hj→i\textbf{h}_{j\rightarrow i}hj→i​进行区别,hj→i\textbf{h}_{j\rightarrow i}hj→i​只是用于计算边的权重,而qj→i(0)\textbf{q}_{j\rightarrow i}^{(0)}qj→i(0)​将在消息传递中使用,因为它包含了节点信息和边的权重信息。
  • 应用D-MPNN机制:mk→j(l)=wj→iqk→j(l−1),∀k:vk∈N(vj)\{vi}\textbf{m}_{k\rightarrow j}^{(l)}=w_{j\rightarrow i}\textbf{q}_{k\rightarrow j}^{(l-1)},\forall k:v_{k}\in N(v_{j})\backslash\left\{v_{i}\right\}mk→j(l)​=wj→i​qk→j(l−1)​,∀k:vk​∈N(vj​)\{vi​}aj→i(l)=∑k:vk∈N(vj)\{vi}mk→j(l)\textbf{a}_{j\rightarrow i}^{(l)}=\sum_{k:v_{k}\in N(v_{j})\backslash\left\{v_{i}\right\}}\textbf{m}_{k\rightarrow j}^{(l)}aj→i(l)​=k:vk​∈N(vj​)\{vi​}∑​mk→j(l)​qj→i(l)=qj→i(l−1)+aj→i(l)\textbf{q}_{j\rightarrow i}^{(l)}=\textbf{q}_{j\rightarrow i}^{(l-1)}+\textbf{a}_{j\rightarrow i}^{(l)}qj→i(l)​=qj→i(l−1)​+aj→i(l)​注意到,边的特征每次都会根据权重进行缩放,这样的效果是实现了节点特征乘以连接它与子结构中心节点的边的权值的乘积。
  • 最后,得到节点viv_{i}vi​为中心的子结构信息:si=fsub(hi+∑j:vj∈N(vi)qj→i(L))\textbf{s}_{i}=f_{sub}(\textbf{h}_{i}+\sum_{j:v_{j}\in N(v_{i})}\textbf{q}_{j\rightarrow i}^{(L)})si​=fsub​(hi​+j:vj​∈N(vi​)∑​qj→i(L)​)其中,fsubf_{sub}fsub​是一个非线性函数。

G-MPNN是可以用于inductive设置的,因为分子总是有原子和键的特征表示,即我们总是可以得到节点和边的特征,从而可以使用G-MPNN提取自适应大小的子结构。

DDI预测的过程

给一个DDI元组(dx,r,dy)(d_{x},r,d_{y})(dx​,r,dy​),预测该事件的概率:P(dx,r,dy)=σ(∑i∣Vx∣∑j∣Vy∣γij(s^i(x))TMrs^j(y))P(d_{x},r,d_{y})=\sigma(\sum_{i}^{|V_{x}|}\sum_{j}^{|V_{y}|}\gamma_{ij}(\widehat{\textbf{s}}_{i}^{(x)})^{T}M_{r}\widehat{\textbf{s}}_{j}^{(y)})P(dx​,r,dy​)=σ(i∑∣Vx​∣​j∑∣Vy​∣​γij​(si(x)​)TMr​sj(y)​)其中,s^i(x),s^j(y)\widehat{\textbf{s}}_{i}^{(x)},\widehat{\textbf{s}}_{j}^{(y)}si(x)​,sj(y)​分别是药物dxd_{x}dx​的子结构iii,和dyd_{y}dy​的子结构jjj经过线性变换后的表达:s^i(x)=Wsi(x),s^j(y)=Wsj(y)\widehat{\textbf{s}}_{i}^{(x)}=W\textbf{s}_{i}^{(x)},\widehat{\textbf{s}}_{j}^{(y)}=W\textbf{s}_{j}^{(y)}si(x)​=Wsi(x)​,sj(y)​=Wsj(y)​其中,W∈Rb×bW\in R^{b\times b}W∈Rb×b是可学习的参数。Mr∈Rb×bM_{r}\in R^{b\times b}Mr​∈Rb×b是反应类型rrr的可学习的参数,并且是对角矩阵:Mr=diag(mr)M_{r}=diag(\textbf{m}_{r})Mr​=diag(mr​),mr∈Rb\textbf{m}_{r}\in R^{b}mr​∈Rb是反应类型rrr的可学习向量。

交叉的子结构注意力γij\gamma_{ij}γij​为:γij=softmax(MLPγ(si(x)∣∣sj(y)))\gamma_{ij}=softmax(MLP_{\gamma}(\textbf{s}_{i}^{(x)}||\textbf{s}_{j}^{(y)}))γij​=softmax(MLPγ​(si(x)​∣∣sj(y)​))现在,DDI预测被分解为DDI元组的二元预测。DDI数据集MMM中的样本都是正样本,我们还需要构造负样本,通过破坏元组(dx,r,dy)(d_{x},r,d_{y})(dx​,r,dy​)即可,比如将dxd_{x}dx​或dyd_{y}dy​替换成别的药物。

通过最小化BCE Loss优化目标,损失函数为:L=−1∣M∣∑i:(dx,r,dy)i∈M(log(pi)+log(1−pi′))L=-\frac{1}{|M|}\sum_{i:(d_{x},r,d_{y})_{i}\in M}(log(p_{i})+log(1-p_{i}'))L=−∣M∣1​i:(dx​,r,dy​)i​∈M∑​(log(pi​)+log(1−pi′​))其中,pi,pi′p_{i},p_{i}'pi​,pi′​分别为正负样本的预测概率。

结果

直推式学习Transductive设定下的模型比较。下表加粗了每项指标的最优值。论文所提方法对每个指标的改进情况显示在最后一行。

下图可视化展示亚硝酸戊酯和西地那非这两种药物之间的DDI prediction。p=0.82p=0.82p=0.82是预测输出值。灰色填充的两个原子是所关心的子结构的中心点。(红色虚线框中的硝酸基团在这两个药物关联之间起了重要作用,根据文献,这两个药不能同时服用)

归纳式学习Inductive设定下的模型表现比较。下表加粗了每项指标最优值。

作者从药物集合DDD中划分药物,随机选取五分之一药物作为DnewD_{new}Dnew​,DnewD_{new}Dnew​不参与训练,即对模型来说是陌生的,Ms1M_{s1}Ms1​表示数据集中的dx,dyd_{x},d_{y}dx​,dy​都来自DnewD_{new}Dnew​,Ms2M_{s2}Ms2​表示数据集中的dxd_{x}dx​来自DnewD_{new}Dnew​,dyd_{y}dy​来自Dold=D−DnewD_{old}=D-D_{new}Dold​=D−Dnew​。

用于药物反应预测的自适应大小的子结构学习相关推荐

  1. 生物信息学|MOLI:基于深度神经网络进行多组学数据整合并用于药物反应预测

    本篇推文引自:MOLI: multi-omics late integration with deep neural networks for drug response prediction 摘要 ...

  2. 生物信息学|机制驱动的可解释深度神经网络,用于药物组合的协同预测和通路反卷积

    0. 摘要     联合用药在癌症治疗方面显示出了巨大的潜力.不仅可以减轻耐药性,而且可以提高治疗效果.抗癌药物数量的快速增长已经导致所有药物组合的实验研究变得昂贵和耗时.计算技术可以提高药物联合筛选 ...

  3. Nat. Commun | 基于网络的药物组合预测

    本期介绍2019年3月发表在Nature Communications的研究工作,该工作由哈佛医学院.东北大学和Dana-Farber癌症研究所等机构的研究人员完成.药物组合能够增加治疗功效和降低毒性 ...

  4. 欧几里得距离网络_Scientific Reports|基于集成相似度的神经网络药物相互作用预测...

    今天给大家介绍发表在Scientific Reports上的一篇文章,"Drug-Drug interaction predicting by neural network Using in ...

  5. 人工智能辅助药物发现(5)药物属性预测

    目录 药物属性预测概述 多肽药物属性预测 多肽属性预测方法 基于序列对比的方法 基于模糊逻辑模型的方法 基于语言生成模型的方法 基于机器学习方法 研究难点 最新进展 元学习多肽药物生物活性预测 多肽毒 ...

  6. 论文翻译 SGCN:Sparse Graph Convolution Network for Pedestrian Trajectory Prediction 用于行人轨迹预测的稀疏图卷积网络

    SGCN:Sparse Graph Convolution Network for Pedestrian Trajectory Prediction 用于行人轨迹预测的稀疏图卷积网络 行人轨迹预测是自 ...

  7. 012用于癫痫发作预测的半扩张卷积神经网络-2021

    Semi-dilated convolutional neural networks for epileptic seizure prediction Abstract 癫痫是一种神经性脑部疾病,影响 ...

  8. Drug Discov. Today | 简要综述GNNs用于分子性质预测

    分子性质预测是药物发现领域的一项基本任务.对其进行准确预测的计算方法可以大大加快以更快.更便宜的方式找到更好的候选药物的整体过程.传统的预测分子性质的计算方法主要依靠提取指纹或人为设计的特征,然后与机 ...

  9. sql 备份 文件大小_预测SQL备份大小

    sql 备份 文件大小 This article will cover the process of analyzing and predicting/forecasting the size of ...

最新文章

  1. 一文详解随机一致性采样算法:RANSAC
  2. mybatis mysql 存储过程_Mysql 存储过程+Mybatis调用实现插入操作例子 | 学步园
  3. Windows Embedded Standard7在金融业的应用
  4. UML序列图总结(Loop、Opt、Par和Alt)
  5. 史上最全Vim快捷键键位图(入门到进阶)
  6. 2.MySQL中的索引
  7. Map的传统输出和使用增强for循环的输出
  8. 华为一则面试题登上热搜;大众点评会员因点赞过多被处罚;Linux Kernel 5.12 发布|极客头条...
  9. 【Python】CentOs7 Python3安装Openssl以及解决ssl问题
  10. 关于异常信息未找到成员
  11. qDebug用法详解
  12. Intellij idea的Dependencies和Libraries有什么区别 ??
  13. 【观察】揭秘宏杉科技存储自主创新“登顶”之路
  14. Flink 实践教程-进阶(11):SQL 关联:Regular Join
  15. 微信支付的分账功能介绍
  16. JavaScript数组常用方法总结及使用详解
  17. 树形结构来了(了解)
  18. 中关村e谷为产业搭台:中关村论坛(空天专场)黑科技亮相现场
  19. java怎么读取数据?
  20. 坚果的2022年终总结

热门文章

  1. 你分库分表的姿势对么?——详谈水平分库分表
  2. 新同事说工厂模式有啥用,别学了
  3. BAT都在悄悄“拆”中台,“碎片化中台” 时代已来!
  4. 推荐几个超NB的技术公号!
  5. 后端架构设计,如何扛住100亿次请求?
  6. TCP/IP 协议栈及 OSI 参考模型详解--云平台技术栈04
  7. 十大流行AI框架和库的优缺点对比
  8. 你知道select count(*)底层究竟干了啥么?
  9. 微服务化的数据库设计与读写分离
  10. 推荐10个能带来快感的实用windows软件,好评如潮!