介绍
万物相连。因此,用图对世界建模是一个自然的选择。例如,MONDO 疾病本体- 一个由数百万个实体(从基因到疾病)组成的知识图谱;或基因本体 - 描述分子功能、细胞成分和生物过程。此外,还有一些数据库,如疾病基因网络(DisGeNet)--探索基因与疾病的关联;Orphanet--罕见病百科全书。如图所示,这些医学和保健知识是零散的。PrimeKG试图...
......整合了 20 个高质量资源,描述了 17,080 种疾病与 4,050,249 种关系,代表了十大生物学尺度,包括与疾病相关的蛋白质扰动、生物学过程和途径、解剖学和表型尺度,以及全部已批准药物及其治疗作用,极大地扩展了以往在以疾病为基础的知识图谱方面所做的努力。
准备和装载
准备
import pandas as pd
df = pd.read_csv(r"edges.csv", header="infer", sep=",", encoding="utf-8", dtype=str, keep_default_na=False)
group = df[[":START_ID", ":END_ID", ":TYPE", "display_relation"]].agg(frozenset, axis=1)
df_result = df.groupby(group).first()
df_result.to_csv(r"edges2.csv", sep=',', encoding='utf-8', index=False)
正在加载
.\bin\neo4j-admin database import full primekg --nodes="D:\[path]\nodes.csv" --relationships="D:\[path]\edges2.csv" --trim-strings=true"D:\[path]\nodes.csv" --relationships="D:\[path]\edges2.csv" --trim-strings=true
CREATE DATABASE primekg
:use primekg
在 Neo4j 浏览器中,输入命令来验证是否一切正常:
MATCH (n) RETURN COUNT(n)
命令应返回 129375。这就是图中的节点数。然后使用命令进一步测试:
MATCH ()-[r]-() RETURN COUNT(DISTINCT r)
它应该返回 4050249。
可视化与探索
可视化
要获取数据库模式,我们可以使用 Neo4j 浏览器中的 CALL db.schema.visualization()。一个可视化图表就会显示出来:
探索
要获取所有节点类型,请使用 CALL db.labels()。结果:
╒════════════════════╕
│label │
╞════════════════════╡
│"anatomy" │"anatomy" │
├────────────────────┤
│"gene__protein" │
├────────────────────┤
│"disease" │
├────────────────────┤
│"effect__phenotype" │
├────────────────────┤
│"drug" │
├────────────────────┤
│"biological_process"│
├────────────────────┤
│"molecular_function"│
├────────────────────┤
│"cellular_component"│
├────────────────────┤
│"exposure" │
├────────────────────┤
│"pathway" │
└────────────────────┘
在论文的第 5 页,我们可以看到节点列表,它们是匹配的!
使用 CALL db.relationshipTypes() 获取所有关系类型。结果
╒════════════════════════════╕
│relationshipType │
╞════════════════════════════╡
│"protein_protein" │"protein_protein" │
├────────────────────────────┤
│"anatomy_protein_present" │
├────────────────────────────┤
│"molfunc_protein" │
├────────────────────────────┤
│"cellcomp_protein" │
├────────────────────────────┤
│"drug_effect" │
├────────────────────────────┤
│"bioprocess_bioprocess" │
├────────────────────────────┤
│"anatomy_anatomy" │
├────────────────────────────┤
│"bioprocess_protein" │
├────────────────────────────┤
│"exposure_disease" │
├────────────────────────────┤
│"exposure_protein" │
├────────────────────────────┤
│"exposure_exposure" │
├────────────────────────────┤
│"exposure_bioprocess" │
├────────────────────────────┤
│"pathway_protein" │
├────────────────────────────┤
│"pathway_pathway" │
├────────────────────────────┤
│"exposure_molfunc" │
├────────────────────────────┤
│"exposure_cellcomp" │
├────────────────────────────┤
│"molfunc_molfunc" │
├────────────────────────────┤
│"cellcomp_cellcomp" │
├────────────────────────────┤
│"anatomy_protein_absent" │
├────────────────────────────┤
│"drug_drug" │
├────────────────────────────┤
│"indication" │
├────────────────────────────┤
│"off-label use" │
├────────────────────────────┤
│"contraindication" │
├────────────────────────────┤
│"drug_protein" │
├────────────────────────────┤
│"disease_phenotype_positive"│
├────────────────────────────┤
│"disease_phenotype_negative"│
├────────────────────────────┤
│"phenotype_phenotype" │
├────────────────────────────┤
│"disease_disease" │
├────────────────────────────┤
│"disease_protein" │
├────────────────────────────┤
│"phenotype_protein" │
└────────────────────────────┘
虽然图表复杂而全面,但我对 "疾病-暴露 "和 "疾病-疾病 "之间的关联很感兴趣。例如,我想知道糖尿病的环境风险因素是什么。查询:
MATCH (e:exposure)-[:exposure_disease]-(d:disease)
WHERE d.node_name CONTAINS 'diabetes'
RETURN d.node_name, e.node_name
ORDER BY d.node_name, e.node_name
结果:
╒═════════════════════════════╤══════════════════════════════════════╕
│d.node_name │e.node_name │
╞═════════════════════════════╪══════════════════════════════════════╡
│"diabetes mellitus (disease)"│"2,4,4',5-tetrachlorobiphenyl" │"diabetes mellitus (disease)"│"2,4,4',5-tetrachlorobiphenyl" │
...
├─────────────────────────────┼──────────────────────────────────────┤
│"diabetes mellitus (disease)"│"bisphenol A" │
├─────────────────────────────┼──────────────────────────────────────┤
│"diabetes mellitus (disease)"│"cyanazine" │
...
对 "双酚 A"(BPA--一种用于生产聚碳酸酯塑料的化学物质)与 "糖尿病 "之间的联系进行一些理智检查:
一些流行病学研究表明,双酚 A 与胰岛素抵抗的发展和葡萄糖稳态受损之间存在显著关联...
备注
原始知识图谱和数据库(PrimeKG由它们组成)肯定会随着时间的推移而改变。
"细节决定成败 合成多个数据源可能会带来挑战,因为不同的数据源可能使用(略有)不同的疾病名称。即使在同一数据源中,"MONDO 包含许多重复的疾病实体,但没有明显的临床相关性。因此,我们将 MONDO 中的疾病归类为医学相关的实体",Chandak 等人[1]指出。然后,作者转而利用 ClinicalBERT 嵌入,以 0.98 的临界值来确定相似性。这只是处理来自不同来源的原始数据的众多步骤之一。
原始的 "edges.csv "包含有向边。起初,我认为这可能是一种假设,因为有向边可以有意义地表示 "A 影响 B"(而不是相反)。然而,当把完整的 edges.csv 加载到 Pandas Dataframe 时,行数完全是论文中预期行数的两倍(8,100,498 对 4,050,249)。因此,我认为作者是碰巧对边缘进行了定向,而不是经过深思熟虑。
总之,PrimeKG 不仅有益于医学研究人员,也有益于机器学习开发人员,因为他们可以利用这种图进行特征工程或图嵌入。