本文章是我在towards data science上发表文章《Neo4j for Diseases》的自译中译本。
注意:本文章并不提供医学建议。它只是提供信息。它并不能取代专业的医学建议,诊断和治疗。
目录
新冠疫情笼罩着全世界。疫情极大地影响着我们的生活。家庭破碎,经济损失,而且我们的日常行为可能也因此而永久改变。同时,疫情也让我们重新关注起公共健康这个问题。有一点是很清楚的,我们人类需要在医学研究上投资更多来避免下一次瘟疫灾情。
图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 |
让我惊奇的是,感染疾病以及两大杀手-心血管疾病和癌症都没有登上