Neo4j看疾病统计数据

本文章是我在towards data science上发表文章《Neo4j for Diseases》的自译中译本。

注意:本文章并不提供医学建议。它只是提供信息。它并不能取代专业的医学建议,诊断和治疗。

目录

1. 预处理并导入数据到Neo4j

2. 快速地获得数据全貌

3. 寻找多用途药物

4. 一些致病生物的细节

5. 使用图算法去发现群和连接性高的节点

5.1 用Louvain算法构建疾病群

5.2 用PageRank去发现连接度高的节点

结论


新冠疫情笼罩着全世界。疫情极大地影响着我们的生活。家庭破碎,经济损失,而且我们的日常行为可能也因此而永久改变。同时,疫情也让我们重新关注起公共健康这个问题。有一点是很清楚的,我们人类需要在医学研究上投资更多来避免下一次瘟疫灾情。

图1:使用Neo4j显示KEGG数据库中COVID-19条目作者作图

我在写完之前的文章《Analyzing Genomes in a Graph Database》后,发现其实京都基因和基因组百科全书(KEGG)还有很多的宝藏等着我们去发掘。其中之一就是其疾病数据库。该子数据库含有很多关于人类疾病方面的细节。结合其他的KEGG子数据库,例如基因组,药物和基因子数据库,我们可以构建一个关于疾病,致病生物和治疗药物的非常完备的知识网络。一如我之前的文章里所说的,Neo4j这样的图数据库非常适用于在生物医疗领域进行知识挖掘。而KEGG的疾病数据正好适用于这样一个项目。我从KEGG那里通过API下载了疾病等子数据库,导入到Neo4j里面,做了几项分析,并且发现了一些有趣的信息。

在这篇文章里,我集中分析疾病,致病生物和药物之间的关系。本项目的源代码放在了我Github的库上:https://github.com/dgg32/kegg_disease

1. 预处理并导入数据到Neo4j

你可以在data文件夹里找到本项目所需要的所有CSV文件。不过如果你想更新数据到最新的状态,请按照README.md里的指引行事。

在Neo4j官网那里下载Neo4j Desktop。下载之后,添加一个新的本地DMBS(“Local DMSBS”),称之为kegg_disease。通过点击...然后Open folder,打开其Import文件夹。将所有的CSV文件放到里面,并执行以下命令,导入数据:

LOAD CSV WITH HEADERS FROM 'file:///disease.csv' AS row MERGE (n:disease {name: row.name, ko: row.ko, description: row.description, disease_category:row.disease_category});
LOAD CSV WITH HEADERS FROM 'file:///drug.csv' AS row MERGE (n:drug {name: row.name, ko: row.ko});
LOAD CSV WITH HEADERS FROM 'file:///pathogen.csv' AS row MERGE (n:pathogen {name: row.name, ko: row.ko, taxonomy: row.taxonomy});

CREATE CONSTRAINT ON (n:disease) ASSERT n.ko IS UNIQUE;
CREATE CONSTRAINT ON (n:drug) ASSERT n.ko IS UNIQUE;
CREATE CONSTRAINT ON (n:pathogen) ASSERT n.ko IS UNIQUE;

LOAD CSV WITH HEADERS FROM 'file:///drug_disease.csv' AS row MERGE (n1:drug {ko: row.from}) MERGE (n2:disease {ko: row.to}) MERGE (n1)-[r:treats]->(n2);
LOAD CSV WITH HEADERS FROM 'file:///pathogen_disease.csv' AS row MERGE (n1:pathogen {ko: row.from}) MERGE (n2:disease {ko: row.to}) MERGE (n1)-[r:causes]->(n2);

2. 快速地获得数据全貌

数据导入之后,我们可以很快地计算出一些KEGG疾病数据库的基本信息。以下三个命令可以算出三种类型节点的总数:

MATCH (p:pathogen) RETURN COUNT(DISTINCT p)

#returns 333


MATCH (dr:drug) RETURN COUNT(DISTINCT dr)

#returns 1339


MATCH (di:disease) RETURN COUNT(DISTINCT di)

#returns 2498

查询结果显示,图数据库里一共有333个“致病生物”,1339个“药物”和2498个“疾病”节点。这个数据库并不大,因此我们可以使用Neo4j Bloom来制作一个数据库的拓扑全貌,在Bloom里输入以下命令并运行(我之前的文章有说明更详细步骤):

MATCH p=(n:disease) <-[]-() RETURN p;

图2: 本项目的拓扑概览。绿色的点代表“疾病”,红色的是“药物”而蓝色的是“致病生物”。作者作图。

以下查询命令可以显示Top 10疾病类型。要注意的是,一些疾病例如Schwartz-Jampel综合征和中央核肌肉病变被归纳到两个以上的疾病类型,但以下的查询命令不会对它们进行重复计数:

MATCH (d:disease) RETURN d.disease_category, COUNT(d.disease_category) as count ORDER BY count DESC LIMIT 10;

结果如下:

d.disease_category count
Congenital malformation 647
Infectious disease 345
Nervous system disease 234
Inherited metabolic disease 124
Cancer 97
Congenital disorder of metabolism 94
Hematologic disease 63
Immune system disease 56
Cardiovascular disease 54
Nervous system disease; Musculoskeletal disease 52

让我惊奇的是,感染疾病以及两大杀手-心血管疾病和癌症都没有登上

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值