5.(2021.7.12)Bioinformatics-KG4SL:用于人类癌症综合致死率预测的知识图神经网络

论文标题:KG4SL: knowledge graph neural network for synthetic lethality prediction in human cancers

论文地址:https://academic.oup.com/bioinformatics/article/37/Supplement_1/i418/6319703

论文期刊:Bioinformatics 2021

摘要

动机:

合成致死(SL) 是发现抗癌药物靶点的一个很有希望的方法。湿实验室筛选SL对的方法存在成本高、批量效应大、脱靶等问题。目前的SL预测计算方法包括基因敲除模拟、基于知识的数据挖掘和机器学习方法。现有的大多数方法都倾向于假设SL对彼此独立,而没有考虑SL对背后共享的生物机制。尽管一些方法已经结合了基因组和蛋白质组数据来帮助SL预测,但这些方法涉及手工特征工程,严重依赖于领域知识。

湿实验室(Wet-Lab)是指基于实验药剂的传统实验;相对地,干实验室(Dry-Lab)是指基于电脑的模拟实验。

结果:

在本文中,我们提出了一种新的基于图神经网络(GNN)的模型KG4SL,该模型将知识图(KG)的消息传递融入到SL预测中。KG使用包括基因、化合物、疾病、生物过程等11种实体和24种可能与SL相关的关系构建。KG的集成有助于解决独立性问题,并通过在KG上进行消息传递绕过手工特征工程。我们的模型在曲线下面积、precision-recall曲线下面积和F1等指标上优于所有最先进的基准模型。大量的实验,包括我们的模型与无监督TransE模型、香草GCN模型及其组合的比较,证明了将KG纳入GNN对SL预测的显著影响。

1.引言

复杂的生物系统不能由大量独立作用的基因组成,而是依赖于基因之间的相互作用,基因之间的相互作用可进一步分为增强和抑制效应。这种抑制效应的特点是,当一对基因同时发生突变时,一些重要的功能将被失活,从而严重降低细胞的活力,而单个基因的突变可能不会影响细胞的活力。一种常见的抑制效应是合成致死性(SL),这一直是癌症药物的一种有前途的策略。如果在肿瘤细胞中发现特定基因失活,抑制其SL配对基因的药物可以导致肿瘤细胞死亡,但不影响正常细胞。因此,SL是抗癌药物靶点的金矿,人们在鉴定SL基因对方面做了大量的努力。高通量湿实验室筛选方法,包括化学库、集合RNA干扰筛选和基于CRISPR的基因组编辑技术已被用于发现SLS,但它们受到各种障碍的阻碍,如高成本、非靶点效应和批次效应。因此,迫切需要设计有效的计算方法来补充湿法实验室筛选技术的缺点。

已经提出了一系列用于SL预测的计算方法。这些方法可以分为三类。第一类涉及使用代谢网络模型模拟电子基因敲除。有人提出通过对候选基因在这些网络中的单敲除和双敲除的效果进行建模来表示SL。第二类被称为面向知识的方法,主要由具有特定领域知识的特征工程进行。为了预测SL对,这些方法使用了网络拓扑特征,例如图形中心性、网络流、连通同构性以及从基因组数据中获得的特征,包括体细胞拷贝数更改、短发夹RNA图谱和基因表示图谱。然而,上述两类生物在很大程度上依赖于代谢网络模型、领域知识和基因组数据,而没有充分利用已知SL对的有价值的信息。

为了利用现有的SL数据,第三类方法应用机器学习算法,其中特征是基于领域知识和启发式函数设计的。有人提出训练支持向量机(SVM)用于SL预测,其中特征提取自蛋白质-蛋白质相互作用(PPI)网络。MetaSL集成了10个分类器的17个特征和加权输出来预测SL。除了传统的机器学习方法外,已经提出了图表示学习方法,这些方法大多采用encoder-decoder架构。在这个架构中,编码器试图将节点映射到低维嵌入,而解码器接受嵌入并利用它来重建原始图中节点的相似性,从而恢复丢失的链接。这种方法可以推广到基于矩阵分解(MF)的方法和基于图神经网络(GNN)的方法。这些方法使用不同的编码器设计,但在解码器的选择上彼此相似(大多采用内积预测器或其归一化变体的形式)。MF方法采用MF编码器。\(\mathrm{SL^2MF}\)提出了一种将SL矩阵、基因本体(GO)相似度矩阵和PPI矩阵分解到低维潜在空间的MF编码器。GRSMF引入了一种自表示的MF编码器,它专注于从已知的SL对中学习表示矩阵,并进一步整合了来自GO的基因之间的功能相似性。有人采用了基于集合矩阵分解(CMF)的方法来集成来自不同来源的数据来预测SLS。

基于MF的编码器只是浅层嵌入方法,它只是为每个节点优化一个唯一的嵌入向量,而不需要在节点之间共享任何参数或利用节点功能。GNN是一种最先进的图深度学习框架,它通过采用不同的嵌入策略来增强上述方法。GNN在原始图上定义了一个消息传递(MP)过程,即在每次迭代时,每个节点将来自其局部邻域的所有嵌入聚合为一条消息,该消息与其先前的嵌入相结合来生成新的嵌入。有人用了一种新的基于GNN的正则化技术--双重丢弃技术来解决SL网络的稀疏性。

然而,现有的基于GNN的方法往往将每个SL对视为一个独立的样本,并没有尝试考虑其潜在的生物学机制。然而,一些共有的因素(如生物过程、途径、细胞成分等)。可能潜移默化地使独立的假设失效。例如,(二磷酸腺苷-核糖)聚合酶1(PARP1)和乳腺癌1(BRCA1)是一对著名的SL基因对,引导了第一种临床批准的基于SL的抗癌药物PARP抑制剂。PARP1和BRCA1都是DNA修复过程中的关键角色。同时,ATM和TP53是另一个广为人知的SL对,ATM也是DNA修复过程中的关键工具。在这里,DNA修复过程可能是两个SL对背后的共同机制。

现有部分方法(例如支持向量机、随机森林(RF)、\(\mathrm{SL^2MF}\)和GRSMF)注入了一些基因组和蛋白质组数据来促进SL预测,这些研究的结果强调了整合额外信息的重要性。同时,基于GNN的方法也可以对输入特征等信息进行编码。然而,这些方法都是基于领域知识手动提取特征,可能会遗漏一些特征。因此,为了获得更全面的特征集以提高SL预测的性能,我们需要一种能够自动进行知识集成和特征提取的新方法。


知识图(KG)是一种多关系图,其中节点和边具有不同的类型。KG被表示为\(G=(V,E)\),其中集合\(E\)中的边被定义为指示两个节点之间的特定关系\(\tau \in \Tau\)的三元组\(e=(h,\tau,t)\)。通过将KG合并到GNN中,可以通过直接将这些潜在因素作为图中的节点引入来缓解上述独立性问题。有人提出了端到端的知识GNN(KGNN),并在药物-药物相互作用(DDI)预测中取得了良好的效果。

在此,我们提出了一种新的基于KGNN的SL预测方法,称为KG4SL,它利用KG的MP作为后端。我们通过将可能与SL相关的各种因素(包括生物过程、疾病、化合物等)注入我们的KG来解决独立性问题。我们的模型包括三个部分:

  1. 在第一部分中,我们从每个原始基因KG中推导出一个特定基因的子图。
  2. 在第二部分中,我们在特定基因的子图上进行MP,以自动将基因与可能在识别SL对起决定性作用的因素相关联。
  3. 在第三部分中,我们定义了一个解码器来在有监督的方式下重建基因-基因相似性。

据我们所知,这是第一个将KG和GNN集成起来进行SL预测的框架。我们将我们的模型与10种最先进的SL预测方法进行了比较,我们的模型在ROC曲线下面积(AUC)、precision-recall曲线下面积(AUPR)和F1上都优于所有基准模型。我们工作的另一个贡献是我们研究了KG的影响,这表明在GNN中引入有MP过程的KG可以显著提高SL预测的性能。

2.模型方法

即给定实体\(e_j\),然后讨论实体\(e_i\)的子图:

以中心节点为起点,遍历各子图实体节点,各实体节点又连接到自己的1跳~H跳邻居,每条连接都是一个关系,赋予一个权值,最后在聚合时进行加权平均,求得\(e_i\)的最终表示,然后通过\(\mathbf{e}[h+1]=\phi(\mathbf{W}(\mathbf{e}[h]+\mathbf{e}_{P(e)})+\mathbf{b})\)得到新的\(e_i\),最后把\(e_i\)和\(e_j\)作内积,即得到预测分数。

在这一部分中,我们首先介绍了SL预测的数据和问题。然后,我们给出了所提出的KG4SL模型的细节。

2.1 数据收集

SynLethDB是合成致死基因对的综合数据库。其最新版本包括一组36,402个人类SL对,以及具有11种实体和24种关系的KG,如表1所示。SynLethDB还包括负SL对,即非SL和合成救援对。然而,与已知的正SL对相比,已知的负SL对要少得多。为了在正样本和负样本之间取得平衡,我们随机选取未知对作为负对,以便有相等数量的正和负SL对。因此,最终的SL数据集包含10,004个基因之间的72,804个基因对。

KG表示为SynLethKG,包括11个实体之间的24种关系。在24种关系中,有16种与基因直接相关,例如(基因,调节,基因)、(基因,相互作用,基因)和(基因,协同变化,基因)。其他8种关系与药物和化合物有关。此外,在11种实体中,有7种与基因直接相关,即途径、细胞成分、生物过程、分子功能、疾病、化合物和解剖。它们的格式是(基因、关系、实体)。这些实体可以从一跳的基因中获得,而其他三种实体(药理学类别、副作用和症状)可以从两跳的基因中获得。删除孤立节点后,SynLethKG的最终图形包含54 012个节点和2 231 921条边,如表1所示。表2和表3显示了有关SynLethKG中的实体和关系的详细信息。用户可以通过搜索他们想要在SynLethDB中研究的基因的名称来访问SynLethKG。

表3中的24个关系描述了基因、药物和化合物的特征。这些关系收集自Genbank、GO、DrugBank、DrugCental、PubMed、Bgee、Strong、Lincs L1000、SIDER4、STARGEO、Uberon和BioGRID。表3还列出了每种关系类型和关联节点的具体数量。此外,SynLethKG中的实体类型和每种实体的数量如表2所示。

2.2 问题陈述

形式上,SL数据可以建模为矩阵\(S\in(0,1)^{n×n}\),其中\(n\)是SL对中涉及的基因数量。在这个SL矩阵\(S\)中,如果基因\(e_i\)和基因\(e_j\)之间存在SL相互作用,则条目\(s_{i,j}\)为1,否则为0。请注意,条目值为0的基因对是未知对,其中一些可能是尚未发现的潜在SL对。知识图SynLethKG表示为\(G=\left(V_e,V_r\right)\),它包含一组实体\(V_e\)和一组关系\(V_r\)。KG中的每条边被定义为三元组\(T=(h,r,t)\),它显示了头部实体\(h\)和尾部实体\(t\)之间的类型\(r\)的关系,其中\(h,t \in V_e\)中,\(r \in V_r\) 。

在给定SL矩阵\(S\)和\(G\)的情况下,我们要解决的问题是预测基因\(e_i\)和基因\(e_j\)之间的SL关系。为了实现这一目标,我们提出了一个基于GNN的模型来学习评分函数\(\hat{s}_{i,j}=F(i,j | \mathbf{W},\mathbf{A},\mathbf{b})\),用来估计基因\(e_i\)和基因\(e_j\)是SL对的可能性,其中\(\mathbf{W},\mathbf{A}\)和\(\mathbf{b}\)表示函数\(F\)中的可学习参数。

2.3 KG4SL概述

图 1. KG4SL 的框架。 KG4SL的工作流程可以分为三个模块,包括特定基因加权子图模块、聚合模块和分数计算模块。 (1) 特定基因加权子图:首先,我们从KG构造一个加权子图。 (2) 聚合:其次,对于每个 SL 对,我们选择与节点直接相关的实体和关系。此外,我们相信生物信息可以通过边在节点之间流动。因此,我们还聚合了间接连接的实体和关系的信息。考虑到算力的问题,只包括了实体和关系两层。 (3) 分数计算:第三,两个基因的聚合结果通过内积计算它们的SL分数。 KG4SL的损失函数由两种损失组成,即基于真值标签和基因-基因分数计算的基础损失,以及使用实体嵌入、关系嵌入和聚合权重计算的L2损失。

KG4SL的总体框架如图1所示。KG4SL利用GNN对来自KG的基因特征进行编码,用于SL预测,分三步进行。

  1. 第一步,我们从KG中为每个SL相关基因导出特定基因的加权子图。具体地说,每条边的权重由特定于基因的关系评分函数来定义,用来描述该关系对其目标基因的重要性。
  2. 第二步,我们设计了一个聚合层,通过在基因特定的加权子图中聚合其邻居的表示来更新给定基因的表示
  3. 第三步,我们根据每个基因对的学习表示,通过归一化内积计算出每个基因对的分数

接下来,我们详细介绍这三个步骤:

2.3.1 特定基因的加权子图

在给定SL相关基因的情况下,我们首先从KG构造一个加权子图。确定相关节点和确定边权重是构建基因特定加权子图的两个关键操作。

假设\(e\)是中心实体节点,并且\(N(e)\)是\(e\)的邻居节点集合。在SynLethKG中,\(N(e)\)的大小在实体之间差别很大。例如,网络集线器可能有数千个关系,而一些节点较少被研究,因此邻居数量很少。在这项工作中,我们为每个实体抽取固定数量的k个邻居来表示其局部结构,并对\(H\)跳(\(H≥1\))重复这个过程。具体地说,如果一个节点邻居数量小于\(k\),则我们重复进行采样,即一个邻居可能被采样不止一次。被采样的\(k\)个邻居的集合被表示为\(P(e)\)。图1中可以看到两跳子图(\(H=2\))的例子,每跳中的邻居抽样大小为\(k=4\)。

在特定于基因的邻居子图中,我们可以为边分配不同的权重来描述关系的重要性。

对于SL对\((e_i,e_j)\),我们先给定\(e_j\),然后讨论\(e_i\)的子图

实体\(e_i\)的子图中的边\(r_{e,e'}\)的权重由\(w^{e_i}_{e,e'}=g(\mathbf{e}_j,\mathbf{r}_{e,e'})\)来计算,其中\(e\)是\(e_i\)的邻居子图中的实体,\(e' \in P(e)\)(即属于实体\(e\)的1跳~H跳邻居节点)。此外,\(\mathbf{e}_j\)和\(\mathbf{r}_{e,e'}\)分别是基因\(e_j\)和关系\(r_{e,e'}\)的特征嵌入;\(g\)是内积函数。权重\(w^{e_i}_{e,e'}\)描述了关系\(r_{e,e'}\)对基因\(e_j\)的重要性。

2.3.2 聚合节点表示

对于基因\(e_i\)的子图中的任何中心实体\(e\),我们聚集其选择的所有邻居的表示以更新其自身的表示。为了显示KG中实体\(e\)的拓扑邻域结构,我们计算\(e\)的邻域的加权平均组合

\[\mathbf{e}_{P(e)}=\sum_{e^{\prime} \in P(e)} \tilde{\omega}_{e, e \prime}^{e_i} \mathbf{e}\tag{1}
\]

其中\(\mathbf{e}\)是实体\(e\)的表示,\(\mathbf{e}_{P(e)}\)可以理解为\(e_i\)子图的中心节点,也就是\(e_i\);基因\(e_i\)和基因\(e_j\)是SL矩阵中的一对,而\(\tilde{w}\)是通过应用Softmax函数进行归一化的基因关系得分:

\[\tilde{\omega}_{e, \stackrel{`}e}^{e_i}=\frac{\exp \left(\omega_{e, e}^{e_i}\right)}{\sum_{\hat{e} \stackrel{`}\in P(e)} \exp \left(\omega_{e, \hat{e}`}^{e_i}\right)}\tag{2}
\]

在一跳子图中获得中心实体的所挑选的邻域表示\(\mathbf{e}_{P(e)}\)之后,它将实体表示\(\mathbf{e}\)集成到单个向量中以更新\(\mathbf{e}\):

\[\mathbf{e}[h+1]=\phi(\mathbf{W}(\mathbf{e}[h]+\mathbf{e}_{P(e)})+\mathbf{b})\tag{3}
\]

其中\(\mathbf{W}\)和\(\mathbf{b}\)分别是线性变换权重和偏置;\(\mathbf{e}[h]\)表示\(\mathbf{e}\)在h跳子图中的表示,从一跳逐步扩大到H跳;\(\phi\)是激活函数(比如\(ReLU\))。通过H跳子图对邻居信息进行聚合后,得到基因\(\hat{\mathbf{e}}_i\)的最终特征表示为\(\mathbf{e}[\mathrm{H}]\)。\(\hat{\mathbf{e}}_j\)的最终特征表示获取也类似。

2.3.3 SL预测分数

最后,通过传递KG的两个子图的信息,我们得到了SL矩阵中这两个基因的最终表示\(\hat{\mathbf{e}}_i\)和\(\hat{\mathbf{e}}_j\)。预测的\(e_i\)基因和\(e_j\)基因的相互作用概率由\(\hat{s}_{i,j}=sigmoid(f(\hat{\mathbf{e}}_i,\hat{\mathbf{e}}_j))\)计算,其中\(f\)是内积函数,\(sigmoid\)函数负责将输出压缩到0~1之间。此外,通过将阈值设置为0.5,可以将该链接预测视为二进制分类问题。\(\hat{s}_{i,j}\)为1或0,即代表候选基因对之间是否存在SL关系。

即给定实体\(e_j\),然后讨论实体\(e_i\)的子图:

以中心节点为起点,遍历各子图实体节点,各实体节点又连接到自己的1跳~H跳邻居,每条连接都是一个关系,赋予一个权值,最后在聚合时进行加权平均,求得\(e_i\)的最终表示,然后通过\(\mathbf{e}[h+1]=\phi(\mathbf{W}(\mathbf{e}[h]+\mathbf{e}_{P(e)})+\mathbf{b})\)得到新的\(e_i\),最后把\(e_i\)和\(e_j\)作内积,即得到预测分数。

2.4 总体损失与优化

我们的模型设计了两种损耗,包括基本损失和L2损失。通过计算边的真值标签和预测标签的交叉熵来计算基本损失J,如下所示:

\[J= \max \left(\hat{s}_{i, j}, 0\right)-\hat{s}_{i, j} \times s_{i, j}+\log \left(1+\exp \left(-\left|\hat{s}_{i, j}\right|\right)\right) \tag{4}
\]

其中,\(\hat{s}_{i,j}\)是边的预测标签,而\(s_{i,j}\)是边的真实标签。

我们还添加一个L2正则化项,定义为:

\[\|\Gamma\|=\frac{\|\mathbf{e}\|+\|\mathbf{r}\|+\|\mathbf{W}\|}{2}\tag{5}
\]

其中\(\|\cdot\|\)表示实体嵌入、关系嵌入和聚集权重的\(L2\)范数。

最终损失综合上述两种损失函数如下:

\[{\min}_{\mathbf{W}, \mathbf{A}, \mathbf{b}} \ell={\min}_{\mathbf{W}, \mathbf{A}, \mathbf{b}} \sum_{i, j} J+\alpha\|\Gamma\| \tag{6}
\]

其中A是可训练加权矩阵,其中每个元素表示基因关系得分,并且L2权重\(a\)是平衡超参数。这里的\(a\)被设置为0.0039。第一项对应于GNN的一部分,这部分同时学习线性变换权重\(\mathbf{W}\)、基因关系得分权重\(\mathbf{A}\)和偏差值\(\mathbf{b}\)。第二项增加了L2正则化项。采用Adam算法来最小化最终损失,并将学习率设置为0.002。算法1概述了KG4SL的框架:

知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2021)-KG4SL:用于人类癌症综合致死率预测的知识图神经网络的更多相关文章

  1. 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2022)-SGCL-DTI:用于DTI预测的监督图协同对比学习

    14.(2022.5.21)Bioinformatics-SGCL-DTI:用于DTI预测的监督图协同对比学习 论文标题: Supervised graph co-contrastive learni ...

  2. 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):生物信息学中的图表示学习:趋势、方法和应用

    4.(2021.6.24)Briefings-生物信息学中的图表示学习:趋势.方法和应用 论文标题: Graph representation learning in bioinformatics: ...

  3. 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2021)-MSTE: 基于多向语义关系的有效KGE用于多药副作用预测

    MSTE: 基于多向语义关系的有效KGE用于多药副作用预测 论文标题: Effective knowledge graph embeddings based on multidirectional s ...

  4. 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2021)-SumGNN:通过有效的KG聚集进行多类型DDI预测

    3.(2021.3.26)Bioinformatics-SumGNN:通过有效的KG聚集进行多类型DDI预测 论文标题: SumGNN: multi-typed drug interaction pr ...

  5. 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2021)-MUFFIN:用于DDI预测的多尺度特征融合

    2.(2021.3.15)Bioinformatics-MUFFIN:用于DDI预测的多尺度特征融合 论文标题: MUFFIN: multi-scale feature fusion for drug ...

  6. 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):MPG:一种有效的自我监督框架,用于学习药物分子的全局表示以进行药物发现

    6.(2021.9.14)Briefings-MPG:一种有效的自我监督框架,用于学习药物分子的全局表示以进行药物发现 论文标题:An effective self-supervised framew ...

  7. 知识图谱-生物信息学-医学论文(Chip-2022)-BCKG-基于临床指南的中国乳腺癌知识图谱的构建与应用

    16.(2022)Chip-BCKG-基于临床指南的中国乳腺癌知识图谱的构建与应用 论文标题: Construction and Application of Chinese Breast Cance ...

  8. 知识图谱-生物信息学-医学论文(BMC Bioinformatics-2022)-挖掘阿尔茨海默病相关KG来确定潜在的相关语义三元组用于药物再利用

    论文标题: Mining On Alzheimer's Diseases Related Knowledge Graph to Identity Potential AD-related Semant ...

  9. 知识图谱顶会论文(ACL-2022) CAKE:用于多视图KGC的可扩展常识感知框架

    CAKE:用于多视图KGC的可扩展常识感知框架.pdf 论文地址:CAKE:Scalable Commonsense-Aware Framework For Multi-View Knowledge ...

随机推荐

  1. 用 Scanner 扫描CSV文件时报错:“java.util.nosuchelementexception:no line found”的解决方法

    最近用 java 对一个很大的 CSV 文件进行处理.打算用 Scanner 逐行扫描进来,结果报错 "java.util.nosuchelementexception:no line fo ...

  2. BZOJ4337 树的同构 (树哈希)(未完成)

    样例迷,没过 交了30pts #include <cstdio> #include <iostream> #include <cstring> #include & ...

  3. pnpm凭什么这么快

    前端包管理器层出不穷,pnpm算是一个后起之秀.它和npm有什么不同,为什么有了npm还要造一个pnpm? npm的问题 npm是最早的包管理器,安装nodejs自带npm,v3版本之前,npm安全依 ...

  4. CF165D Beard Graph(dfs序+树状数组)

    题面 题解 乍一看,单点修改,单链查询,用树链剖分维护每条链上白边的数量就完了, 还是--得写树链剖分吗?--3e5,乘两个log会T吗-- (双手颤抖) (纠结) 不!绝不写树链剖分! 这题如果能维 ...

  5. DES|3DES|AES|RSA|DH | CA | SSL(HTTPS)

    1.对称密钥算法: 加解密速度块,算法使安全的,已知算法无法推出密钥.但是密钥的分发困难. DES:对称密钥算法,是一种块加密算法,只有一个密钥.加解密都是用一个密钥. 3DES:与DES一样,可以认 ...

  6. .NET 7 SDK 对容器的内置支持

    大家好,我是等天黑. .NET 又双叒叕出新功能了, 就在前几天,.NET 团队发布博客,宣称在 .NET SDK 中内置了对 .NET 应用容器化的支持. 小试牛刀 在正式介绍它之前,先通过一个简单 ...

  7. Rust 从入门到精通06-语句和表达式

    1.语句和表达式 语句和表达式是 Rust 语言实现逻辑控制的基本单元. 在 Rust 程序里面,语句(Statement)是执行一些操作但不返回的指令,表达式(Expressions)计算并产生一个 ...

  8. 给定字符串定义char *a = “I love China!”,读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串

    include<stdio.h> include<string.h> int main() { const char *a="I love China!"; ...

  9. ubuntu下vscode安装go插件失败解决办法

    go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.io,direct go env -w GOSUMDB=gosum.io+ce6e ...

  10. VMware Component Manager服务无法启动

    近日,给一台Windows 2016上的vCenter打补丁,系统重启后,发现vmware的很多服务无法启动了.这是一台老版本的vcenter,虽然已经2021年了,但是它还管理着一些很老的ESX,比 ...