探索 PrimeKG — 医学和医疗保健知识图谱

探索 PrimeKG — 医学和医疗保健知识图谱

Barry Lv6

本文将简要介绍论文“构建知识图谱以实现精准医疗”(Chandak 等,2023)[1](即 PrimeKG),加载图数据并进行可视化,使用 Neo4j Desktop — 一种图数据库。

介绍

一切都是相互关联的。因此,用图形建模世界是一个自然的选择。例如,MONDO 疾病本体 [2] — 一个知识图谱,由数百万个实体组成,从基因到疾病;或者基因本体 [4] — 描述分子功能、细胞成分和生物过程。此外,还有数据银行,例如疾病基因网络 (DisGeNet) [3] — 探索基因与疾病的关联;Orphanet — 一部罕见疾病的百科全书。如上所示,这种医学和健康知识是零散的。PrimeKG [1] 是一个尝试…

…整合了 20 个高质量资源,以描述 17,080 种疾病及其 4,050,249 个关系,代表十个主要生物学尺度,包括与疾病相关的蛋白质扰动、生物过程和途径、解剖和表型尺度,以及所有已批准药物及其治疗作用,显著扩展了之前在疾病根源知识图谱中的努力。

让我们开始吧!😀

准备与加载

准备

  1. 按照链接访问 PrimeKG 原始数据 [5]。下载 “edges.csv” (368.6 MB) 和 “nodes.csv” (7.5 MB)。为什么?→ 还有其他文件,例如 “kg.csv”,它包含完整图(每行格式为 node1-relation-node2)。但是使用单独的节点和边文件导入图是 最快和最有效的方法 [8]。
  2. 下载并安装 Open JDK。我通常使用 Eclipse Temurin [7]。选择版本 17 (LTS) 或 21 (LTS)。安装后,检查 JAVA_HOME 环境变量是否指向正确的 JDK 位置。为什么?→ 我们稍后需要 JDK 来运行 Neo4j 中的 “neo4j-admin.bat”。
  3. 使用 Notepad++ 将 “edges.csv” 的标题更改为 :TYPE,display_relation,:START_ID,:END_ID。将 “nodes.csv” 的标题更改为 node_index:ID,node_id,:LABEL,node_name,node_source。为什么?→ Neo4j 导入工具 [8] 要求 CSV 文件的标题遵循特定的指南,例如哪个列是 ID。
  4. 使用 Notepad++ 在 “nodes.csv” 中将 “/” 替换为 “__”。为什么?→ Neo4j 节点名称必须遵循某些限制。
  5. 下载并安装 Anaconda ,或者至少安装带有 Pandas 库的 Python。为什么?→ 不幸的是,我发现 “edges.csv” 包含重复边,这意味着我们有一行 CSV 说 “节点 A 指向节点 B,关系为 _relation X_”,还有另一行说 “节点 B 指向节点 A,关系为 _relation X_”。**我们打算在 Neo4j 中构建一个 无向图 **。因此,我们必须删除重复边。我只知道如何使用 Python/Pandas 来做到这一点! 😅
1
2
3
4
5
6
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)

加载

  1. 打开 Neo4j Desktop。创建一个新项目。添加“本地 DBMS”。寻找三个点:点击它,然后选择“打开文件夹”,再选择“DBMS”。
  2. Windows 资源管理器将打开 DBMS 所在的位置。在我的情况下,它是 C:\Users\[Username]\.Neo4jDesktop\relate-data\dbmss\dbms-886ac993–25d9–493a-922b-2d41e29b6446
  3. 在那里打开 CMD。现在使用下面的命令。记得适当更改 [path]
1
.\bin\neo4j-admin database import full primekg --nodes="D:\[path]\nodes.csv" --relationships="D:\[path]\edges2.csv" --trim-strings=true
  1. 在 Neo4j Desktop 中,点击“启动”按钮,根据已创建的 DBMS。然后点击“打开”以打开 Neo4j 浏览器。
  2. 创建数据库“primekg”。然后将其更改为使用该数据库作为 活动 数据库。(这些是 Cypher 查询
1
2
CREATE DATABASE primekg
:use primekg

在 Neo4j 浏览器中,输入命令以验证一切是否正常:

1
MATCH (n) RETURN COUNT(n)

该命令应返回 129375。这是图中的节点数量。然后使用以下命令进行进一步测试:

1
MATCH ()-[r]-() RETURN COUNT(DISTINCT r)

它应返回 4050249。在论文的第 2 页 [1] 中,我们读到:

129,375 个节点和 4,050,249 个关系中,PrimeKG 捕获了十个主要生物尺度的信息。

一切都已设置好!

可视化与探索

可视化

要获取数据库模式,我们可以在 Neo4j 浏览器中使用 CALL db.schema.visualization()。会显示一个可视化图形:

PrimeKG 模式

探索

要获取所有节点类型,请使用 CALL db.labels()。结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
╒════════════════════╕
│label │
╞════════════════════╡
│"anatomy" │
├────────────────────┤
│"gene__protein" │
├────────────────────┤
│"disease" │
├────────────────────┤
│"effect__phenotype" │
├────────────────────┤
│"drug" │
├────────────────────┤
│"biological_process"│
├────────────────────┤
│"molecular_function"│
├────────────────────┤
│"cellular_component"│
├────────────────────┤
│"exposure" │
├────────────────────┤
│"pathway" │
└────────────────────┘

在论文[1]的第5页中,我们可以看到节点列表,并且它们是匹配的!

要获取所有关系类型,请使用 CALL db.relationshipTypes()。结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
╒════════════════════════════╕
│relationshipType │
╞════════════════════════════╡
│"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" │
└────────────────────────────┘

在论文[1]的第9页中,我们看到了关系类型的列表,它们(可能)是匹配的!😅

尽管图表复杂且完整,我对“疾病-暴露”和“疾病-疾病”之间的关联感兴趣。例如,我想知道糖尿病的环境风险因素可能是什么。查询:

1
2
3
4
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

结果:

1
2
3
4
5
6
7
8
9
10
╒═════════════════════════════╤══════════════════════════════════════╕
│d.node_name │e.node_name │
╞═════════════════════════════╪══════════════════════════════════════╡
│"diabetes mellitus (disease)"│"2,4,4',5-tetrachlorobiphenyl" │
...
├─────────────────────────────┼──────────────────────────────────────┤
│"diabetes mellitus (disease)"│"bisphenol A" │
├─────────────────────────────┼──────────────────────────────────────┤
│"diabetes mellitus (disease)"│"cyanazine" │
...

对“双酚A”(BPA——一种用于生产聚碳酸酯塑料的化学物质)与“糖尿病”之间的关联进行一些合理性检查:论文[9]显示:

几项流行病学研究揭示了双酚A与 胰岛素抵抗的发展葡萄糖稳态受损之间的显著关联……

备注

原始知识图谱以及PrimeKG所组成的数据库确实会随着时间而变化。如何从崩溃中重建PrimeKG(即更新它)在[6]中有建议。

“细节决定成败。” 综合多个数据源可能会带来挑战,因为不同的数据源可能会对疾病使用(略微)不同的名称。即使在同一来源中,“MONDO包含许多没有明显临床相关性的重复疾病实体。出于这个原因,我们希望将MONDO中的疾病分组为医学相关的实体”,正如Chandak等人所指出的[1]。然后,作者转向利用ClinicalBERT嵌入,设定截止阈值为0.98来确定相似性。这只是处理来自各种来源的原始数据的众多步骤之一。

原始的“edges.csv”包含有向边。起初,我认为这可能有某种假设,因为有向边能够有意义地指示“A影响B”(而不是反过来)。然而,当将完整的“edges.csv”加载到Pandas Dataframe中时,行数是论文中预期行数的_完美两倍_(8,100,498对比4,050,249)。所以我认为作者偶然得到了有向边,而不是经过仔细考虑。

有向边(在“edges.csv”中)—— 一个示例。最左侧的数字是行索引。

总之,PrimeKG不仅对医学研究人员有益,对机器学习开发人员也同样有益,因为他们可以利用这样的图进行特征工程或图嵌入 。 🧐

参考文献

[1] 建立知识图谱以实现精准医疗. Chandak 等 (2023) ( https://www.nature.com/articles/s41597-023-01960-3 )

[2] MONDO 疾病本体 ( https://monarchinitiative.org/ )

[3] DisGeNET ( https://disgenet.com/ )

[4] 基因本体 ( https://geneontology.org/ )

[5] PrimeKG 数据 ( https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/IXA7BM&version=2.1 )

[6] PrimeKG 源代码 ( https://github.com/mims-harvard/PrimeKG )

[7] Eclipse Temurin ( https://adoptium.net/temurin/releases/ )

[8] Neo4j 导入 ( https://neo4j.com/docs/operations-manual/current/tools/neo4j-admin/neo4j-admin-import/#import-tool-syntax )

[9] 双酚A与2型糖尿病:流行病学、功能和早期生活因素的综述 ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7830729/ )

知识图谱

知识图谱嵌入

Neo4j

Neo4j 图数据库

图嵌入

  • 标题: 探索 PrimeKG — 医学和医疗保健知识图谱
  • 作者: Barry
  • 创建于 : 2024-07-24 09:01:02
  • 更新于 : 2024-08-31 06:59:45
  • 链接: https://wx.role.fun/2024/07/24/b0f8aaa2c78849f5b175a0d55f9b594b/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
探索 PrimeKG — 医学和医疗保健知识图谱