单组学数据集成
将组学数据集成到知识图谱 (Knowledge Graphs)中,通常是从单一数据类型(如 RNA-seq 实验)开始的,这为后续的多组学集成奠定了基础。通过在 Neo4j 中表示 RNA-seq 数据,研究人员可以摆脱静态表格的束缚,拥抱转录组信息固有的关联性。
每一个转录本测量值都会成为一个节点,并与其对应的基因、样本元数据、实验条件和生物学注释相连接。这种图结构自然地捕捉了差异表达基因、其蛋白质产物、相关通路以及临床表型之间的关系——所有这些都可以通过直观的图遍历进行查询。例如,研究人员可以快速识别跨多个实验的共表达基因模块,追踪从转录本到蛋白质再到通路的表达变化,或者将表达特征与患者预后联系起来。Neo4j 的原生图架构将 RNA-seq 数据从孤立的数据集转变为集成的分子图谱,从而加速假设生成和生物学发现。
场景
典型的研究场景包括比较病例(具有特定结果的人群)与对照组(不具有该结果的人群)样本,以识别病理的分子特征。研究人员从病例和对照组中收集组织样本,例如非酒精性脂肪性肝病患者与健康对照者的肝活检样本。这些样本进行 RNA-seq 实验,原始测序数据通过生物信息学流程处理,以识别两组之间的差异表达基因。分析结果(如前 10 个上调或下调基因及其倍数变化和统计学显著性)随后存储在 Neo4j 中。
在图数据库中,每个生物样本都成为一个节点,其属性描述了组织类型、患者人口统计学信息和分组归属(对照组或病例组)。样本节点连接到代表 RNA-seq 分析的实验节点,而实验节点又链接到差异表达转录本的基因节点。这种结构使得跨实验查询变得非常直观——例如,识别在多个疾病队列中持续失调的基因,追踪受影响的通路,或将表达变化与已知的蛋白质功能联系起来。图自然地表示了实验设计,以一种既支持即时分析又支持未来与额外组学层集成的形式,保留了样本、条件和分子测量之间的关系。
我们的方案从基础的单组学场景开始,说明了转录组学数据(如 RNA-seq)如何在图结构中建模。我们将通过演示如何扩展同一框架以处理多组学集成并纳入来自生物医学本体的丰富信息,来逐步扩展这一核心模型。随着模型的增长,更复杂的生物学和临床问题可以直接在图中得到解决。
解决方案
该解决方案构建了一个用于 RNA-seq 数据集成的单组学模型,并使用 Neo4j 实现。
适应异构数据
即使在 RNA-seq 这种单一组学类型内,实验之间也可能存在巨大差异。不同的组织来源、多样的表型注释、多个比较组以及不同层级的生物学注释,图模型可以无缝处理这种异构性。项目通过灵活的属性连接到样本,样本链接到其组织起源和表型(使用如 EFO 这样的标准化词汇),而实验则捕捉特定于方法论的元数据。至关重要的是,“比较 (Comparison)”节点使研究人员能够对复杂的实验设计进行建模——无论是比较疾病与对照、治疗与基线,还是同时比较多种条件——而无需重构整个数据库。
探索的灵活性
当解决生物学问题时,该架构的灵活性展现得淋漓尽致。需要查找多个肝病实验中所有差异表达的基因?只需从“疾病 (Disease) → 基因 (Gene) ← 实验 (Experiment) ← 样本 (Sample) ← 组织 (Tissue)”进行遍历。想要识别在特定表型中无论组织类型如何都持续失调的基因?图结构使这变得非常自然。正在寻找功能富集?只需沿着“基因 (Gene) → 蛋白质 (Protein) → GO”路径追踪。图的属性模型还允许每个节点类型携带特定于实验的属性(如倍数变化、p 值、表达水平),而无需强迫每个实验共享完全相同的属性。
这种适应性结构意味着研究人员可以逐步集成新的 RNA-seq 数据集,在可用时添加新的注释层,并探索生物学联系,而无需大规模重构数据库——从而将单组学分析从数据管理的负担转变为洞察力的源泉。
数据模型
该图数据模型展示了 Neo4j 的灵活模式如何优雅地解决了单组学数据固有的异构性。与需要预定义表结构的刚性关系数据库不同,这种图架构允许研究人员自然地表示现实组学项目中常见的不同实验背景、多样的样本注释和多种标识符系统。
我们将通过在 多组学数据集成 (Multi-OMICs Data Integration) 页面中添加更多的组学数据类型和本体,继续完善该模型。
演示数据
以下 Cypher 语句将在 Neo4j 数据库中创建一个示例图:
// ============================================
// EXTENDED OMICS DATASET WITH COMPARISON NODES
// ============================================
// MERGE Projects
MERGE (p1:Project {sid: "PROJ001", name: "Liver Disease Study"})
MERGE (p2:Project {sid: "PROJ002", name: "Diabetes Research"})
MERGE (p3:Project {sid: "PROJ003", name: "Cross-Disease Metabolic Study"})
// MERGE Tissues
MERGE (t1:Tissue {sid: "UBERON:0002107", name: "Liver"})
MERGE (t2:Tissue {sid: "UBERON:0001264", name: "Pancreas"})
MERGE (t3:Tissue {sid: "UBERON:0000945", name: "Adipose tissue"})
// MERGE Diseases
MERGE (d1:Disease {sid: "MONDO:0005359", name: "Non-alcoholic fatty liver disease"})
MERGE (d2:Disease {sid: "MONDO:0005015", name: "Type 2 Diabetes"})
MERGE (d3:Disease {sid: "MONDO:0011382", name: "Metabolic Syndrome"})
// MERGE Phenotypes (EFO)
MERGE (ph1:EFO {sid: "EFO:0004220", name: "Insulin resistance"})
MERGE (ph2:EFO {sid: "EFO:0001421", name: "Elevated triglycerides"})
MERGE (ph3:EFO {sid: "EFO:0004465", name: "Hepatic steatosis"})
MERGE (ph4:EFO {sid: "EFO:0000685", name: "Obesity"})
// MERGE Samples
MERGE (s1:Sample {sid: "SAMPLE001", name: "Patient_001_Liver", condition: "NAFLD"})
MERGE (s2:Sample {sid: "SAMPLE002", name: "Control_001_Liver", condition: "Healthy"})
MERGE (s3:Sample {sid: "SAMPLE003", name: "Patient_002_Pancreas", condition: "T2D"})
MERGE (s4:Sample {sid: "SAMPLE004", name: "Control_002_Pancreas", condition: "Healthy"})
MERGE (s5:Sample {sid: "SAMPLE005", name: "Patient_003_Liver", condition: "NAFLD"})
MERGE (s6:Sample {sid: "SAMPLE006", name: "Patient_004_Adipose", condition: "MetSyn"})
MERGE (s7:Sample {sid: "SAMPLE007", name: "Control_003_Adipose", condition: "Healthy"})
// MERGE Experiments
MERGE (e1:Experiment {sid: "EXP001", type: "RNA-seq", platform: "Illumina NovaSeq"})
MERGE (e2:Experiment {sid: "EXP002", type: "RNA-seq", platform: "Illumina NovaSeq"})
MERGE (e3:Experiment {sid: "EXP003", type: "RNA-seq", platform: "Illumina NovaSeq"})
// ============================================
// EXTENDED COMPARISON NODES
// ============================================
// Basic disease vs control comparisons
MERGE (comp1:Comparison {
sid: "COMP001",
name: "NAFLD vs Control (Liver)",
type: "disease_vs_control",
tissue: "Liver",
n_case: 2,
n_control: 1,
analysis_date: "2024-01-15"
})
MERGE (comp2:Comparison {
sid: "COMP002",
name: "T2D vs Control (Pancreas)",
type: "disease_vs_control",
tissue: "Pancreas",
n_case: 1,
n_control: 1,
analysis_date: "2024-01-20"
})
MERGE (comp3:Comparison {
sid: "COMP003",
name: "Metabolic Syndrome vs Control (Adipose)",
type: "disease_vs_control",
tissue: "Adipose",
n_case: 1,
n_control: 1,
analysis_date: "2024-02-01"
})
// Cross-tissue comparisons (same disease, different tissues)
MERGE (comp4:Comparison {
sid: "COMP004",
name: "NAFLD Liver vs T2D Pancreas",
type: "cross_tissue_disease",
tissue: "Liver vs Pancreas",
description: "Compare molecular signatures between NAFLD and T2D",
analysis_date: "2024-02-10"
})
// Phenotype-based comparison
MERGE (comp6:Comparison {
sid: "COMP006",
name: "Insulin Resistant vs Non-Resistant",
type: "phenotype_stratified",
stratification: "Insulin resistance status",
description: "Compare samples with vs without insulin resistance",
analysis_date: "2024-02-20"
})
// Multi-disease meta-analysis
MERGE (comp8:Comparison {
sid: "COMP008",
name: "Pan-Metabolic Disease Signature",
type: "meta_analysis",
diseases: "NAFLD, T2D, MetSyn",
description: "Common molecular signatures across metabolic diseases",
analysis_date: "2024-03-05"
})
// ============================================
// MERGE GENES with expression data
// ============================================
MERGE (g1:Gene {sid: "ENSG00000105851", symbol: "PIK3CG", name: "Phosphatidylinositol-3-kinase catalytic gamma", source: "Ensembl"})
MERGE (g2:Gene {sid: "ENSG00000169245", symbol: "CXCL10", name: "C-X-C motif chemokine ligand 10", source: "Ensembl"})
MERGE (g3:Gene {sid: "ENSG00000198793", symbol: "MTOR", name: "Mechanistic target of rapamycin kinase", source: "Ensembl"})
MERGE (g4:Gene {sid: "ENSG00000134108", symbol: "AKT1", name: "AKT serine/threonine kinase 1", source: "Ensembl"})
MERGE (g5:Gene {sid: "ENSG00000171408", symbol: "PPARG", name: "Peroxisome proliferator activated receptor gamma", source: "Ensembl"})
MERGE (g6:Gene {sid: "ENSG00000108932", symbol: "CD36", name: "CD36 molecule", source: "Ensembl"})
MERGE (g7:Gene {sid: "ENSG00000163631", symbol: "ALB", name: "Albumin", source: "Ensembl"})
MERGE (g8:Gene {sid: "ENSG00000169429", symbol: "CXCL8", name: "C-X-C motif chemokine ligand 8", source: "Ensembl"})
// MERGE IDs (alternative identifiers)
MERGE (id1:ID {sid: "5294", source: "NCBI"})
MERGE (id2:ID {sid: "3627", source: "NCBI"})
MERGE (id3:ID {sid: "2475", source: "NCBI"})
MERGE (id4:ID {sid: "207", source: "NCBI"})
MERGE (id5:ID {sid: "5468", source: "NCBI"})
// MERGE Proteins
MERGE (pr1:Protein {sid: "P48736", source: "UniProt", name: "PIK3CG"})
MERGE (pr2:Protein {sid: "P02778", source: "UniProt", name: "CXCL10"})
MERGE (pr3:Protein {sid: "P42345", source: "UniProt", name: "MTOR"})
MERGE (pr4:Protein {sid: "P31749", source: "UniProt", name: "AKT1"})
MERGE (pr5:Protein {sid: "P37231", source: "UniProt", name: "PPARG"})
MERGE (pr6:Protein {sid: "P16671", source: "UniProt", name: "CD36"})
MERGE (pr7:Protein {sid: "P02768", source: "UniProt", name: "ALB"})
// MERGE GO terms
MERGE (go1:GO {sid: "GO:0005158", name: "insulin receptor binding"})
MERGE (go2:GO {sid: "GO:0006954", name: "inflammatory response"})
MERGE (go4:GO {sid: "GO:0008286", name: "insulin receptor signaling pathway"})
MERGE (go5:GO {sid: "GO:0006629", name: "lipid metabolic process"})
MERGE (go6:GO {sid: "GO:0006955", name: "immune response"});
// ============================================
// RELATIONSHIPS: PROJECT -> SAMPLE
// ============================================
WITH ["SAMPLE001", "SAMPLE002", "SAMPLE005"] AS samples
MATCH (p:Project {sid: "PROJ001"}), (s:Sample)
WHERE s.sid IN samples
MERGE (p)-[:HAS_SAMPLE]->(s);
WITH ["SAMPLE003", "SAMPLE004"] AS samples
MATCH (p:Project {sid: "PROJ002"}), (s:Sample)
WHERE s.sid IN samples
MERGE (p)-[:HAS_SAMPLE]->(s);
WITH ["SAMPLE006", "SAMPLE007"] AS samples
MATCH (p:Project {sid: "PROJ003"}), (s:Sample)
WHERE s.sid IN samples
MERGE (p)-[:HAS_SAMPLE]->(s);
// ============================================
// RELATIONSHIPS: SAMPLE -> TISSUE
// ============================================
WITH ["SAMPLE001", "SAMPLE002", "SAMPLE005"] AS samples
MATCH (s:Sample), (t:Tissue {sid: "UBERON:0002107"})
WHERE s.sid IN samples
MERGE (s)-[:TAKEN_FROM]->(t);
WITH ["SAMPLE003", "SAMPLE004"] AS samples
MATCH (s:Sample), (t:Tissue {sid: "UBERON:0001264"})
WHERE s.sid IN samples
MERGE (s)-[:TAKEN_FROM]->(t);
WITH ["SAMPLE006", "SAMPLE007"] AS samples
MATCH (s:Sample), (t:Tissue {sid: "UBERON:0000945"})
WHERE s.sid IN samples
MERGE (s)-[:TAKEN_FROM]->(t);
// ============================================
// RELATIONSHIPS: SAMPLE -> PHENOTYPE
// ============================================
MATCH (s:Sample {sid: "SAMPLE001"}), (ph:EFO {sid: "EFO:0001421"})
MERGE (s)-[:HAS_PHENOTYPE]->(ph);
MATCH (s:Sample {sid: "SAMPLE001"}), (ph:EFO {sid: "EFO:0004465"})
MERGE (s)-[:HAS_PHENOTYPE]->(ph);
MATCH (s:Sample {sid: "SAMPLE003"}), (ph:EFO {sid: "EFO:0004220"})
MERGE (s)-[:HAS_PHENOTYPE]->(ph);
MATCH (s:Sample {sid: "SAMPLE005"}), (ph:EFO {sid: "EFO:0004465"})
MERGE (s)-[:HAS_PHENOTYPE]->(ph);
MATCH (s:Sample {sid: "SAMPLE006"}), (ph:EFO {sid: "EFO:0000685"})
MERGE (s)-[:HAS_PHENOTYPE]->(ph);
MATCH (s:Sample {sid: "SAMPLE006"}), (ph:EFO {sid: "EFO:0004220"})
MERGE (s)-[:HAS_PHENOTYPE]->(ph);
// ============================================
// RELATIONSHIPS: SAMPLE -> EXPERIMENT
// ============================================
MATCH (s:Sample {sid: "SAMPLE001"}), (e:Experiment {sid: "EXP001"})
MERGE (s)-[:HAS_EXPERIMENT]->(e);
MATCH (s:Sample {sid: "SAMPLE002"}), (e:Experiment {sid: "EXP001"})
MERGE (s)-[:HAS_EXPERIMENT]->(e);
MATCH (s:Sample {sid: "SAMPLE005"}), (e:Experiment {sid: "EXP001"})
MERGE (s)-[:HAS_EXPERIMENT]->(e);
MATCH (s:Sample {sid: "SAMPLE003"}), (e:Experiment {sid: "EXP002"})
MERGE (s)-[:HAS_EXPERIMENT]->(e);
MATCH (s:Sample {sid: "SAMPLE004"}), (e:Experiment {sid: "EXP002"})
MERGE (s)-[:HAS_EXPERIMENT]->(e);
MATCH (s:Sample {sid: "SAMPLE006"}), (e:Experiment {sid: "EXP003"})
MERGE (s)-[:HAS_EXPERIMENT]->(e);
MATCH (s:Sample {sid: "SAMPLE007"}), (e:Experiment {sid: "EXP003"})
MERGE (s)-[:HAS_EXPERIMENT]->(e);
// ============================================
// RELATIONSHIPS: COMPARISON -> EXPERIMENT
// ============================================
// Basic comparisons to experiments
MATCH (c:Comparison {sid: "COMP001"}), (e:Experiment {sid: "EXP001"})
MERGE (c)-[:COMPARES]->(e);
MATCH (c:Comparison {sid: "COMP002"}), (e:Experiment {sid: "EXP002"})
MERGE (c)-[:COMPARES]->(e);
MATCH (c:Comparison {sid: "COMP003"}), (e:Experiment {sid: "EXP003"})
MERGE (c)-[:COMPARES]->(e);
// Cross-tissue comparison
MATCH (c:Comparison {sid: "COMP004"}), (e:Experiment {sid: "EXP001"})
MERGE (c)-[:COMPARES]->(e);
MATCH (c:Comparison {sid: "COMP004"}), (e:Experiment {sid: "EXP002"})
MERGE (c)-[:COMPARES]->(e);
// Meta-analysis comparison (all experiments)
MATCH (c:Comparison {sid: "COMP008"}), (e:Experiment {sid: "EXP001"})
MERGE (c)-[:COMPARES]->(e);
MATCH (c:Comparison {sid: "COMP008"}), (e:Experiment {sid: "EXP002"})
MERGE (c)-[:COMPARES]->(e);
MATCH (c:Comparison {sid: "COMP008"}), (e:Experiment {sid: "EXP003"})
MERGE (c)-[:COMPARES]->(e);
// ============================================
// RELATIONSHIPS: COMPARISON -> SAMPLE (Direct)
// ============================================
// COMP001: NAFLD vs Control samples
MATCH (c:Comparison {sid: "COMP001"}), (s:Sample {sid: "SAMPLE001"})
MERGE (c)-[:INCLUDES_CASE]->(s);
MATCH (c:Comparison {sid: "COMP001"}), (s:Sample {sid: "SAMPLE005"})
MERGE (c)-[:INCLUDES_CASE]->(s);
MATCH (c:Comparison {sid: "COMP001"}), (s:Sample {sid: "SAMPLE002"})
MERGE (c)-[:INCLUDES_CONTROL]->(s);
// COMP002: T2D vs Control samples
MATCH (c:Comparison {sid: "COMP002"}), (s:Sample {sid: "SAMPLE003"})
MERGE (c)-[:INCLUDES_CASE]->(s);
MATCH (c:Comparison {sid: "COMP002"}), (s:Sample {sid: "SAMPLE004"})
MERGE (c)-[:INCLUDES_CONTROL]->(s);
// COMP003: MetSyn vs Control samples
MATCH (c:Comparison {sid: "COMP003"}), (s:Sample {sid: "SAMPLE006"})
MERGE (c)-[:INCLUDES_CASE]->(s);
MATCH (c:Comparison {sid: "COMP003"}), (s:Sample {sid: "SAMPLE007"})
MERGE (c)-[:INCLUDES_CONTROL]->(s);
// COMP006: Phenotype-stratified (Insulin Resistant)
MATCH (c:Comparison {sid: "COMP006"}), (s:Sample)-[:HAS_PHENOTYPE]->(ph:EFO {sid: "EFO:0004220"})
MERGE (c)-[:INCLUDES_CASE]->(s);
MATCH (c:Comparison {sid: "COMP006"}), (s:Sample)
WHERE NOT (s)-[:HAS_PHENOTYPE]->(:EFO {sid: "EFO:0004220"})
AND s.condition = "Healthy"
MERGE (c)-[:INCLUDES_CONTROL]->(s);
// ============================================
// RELATIONSHIPS: COMPARISON -> DISEASE
// ============================================
MATCH (c:Comparison {sid: "COMP001"}), (d:Disease {sid: "MONDO:0005359"})
MERGE (c)-[:STUDIES_DISEASE]->(d);
MATCH (c:Comparison {sid: "COMP002"}), (d:Disease {sid: "MONDO:0005015"})
MERGE (c)-[:STUDIES_DISEASE]->(d);
MATCH (c:Comparison {sid: "COMP003"}), (d:Disease {sid: "MONDO:0011382"})
MERGE (c)-[:STUDIES_DISEASE]->(d);
MATCH (c:Comparison {sid: "COMP004"}), (d:Disease {sid: "MONDO:0005359"})
MERGE (c)-[:STUDIES_DISEASE]->(d);
MATCH (c:Comparison {sid: "COMP004"}), (d:Disease {sid: "MONDO:0005015"})
MERGE (c)-[:STUDIES_DISEASE]->(d);
// Meta-analysis
MATCH (c:Comparison {sid: "COMP008"}), (d:Disease {sid: "MONDO:0005359"})
MERGE (c)-[:STUDIES_DISEASE]->(d);
MATCH (c:Comparison {sid: "COMP008"}), (d:Disease {sid: "MONDO:0005015"})
MERGE (c)-[:STUDIES_DISEASE]->(d);
MATCH (c:Comparison {sid: "COMP008"}), (d:Disease {sid: "MONDO:0011382"})
MERGE (c)-[:STUDIES_DISEASE]->(d);
// ============================================
// RELATIONSHIPS: EXPERIMENT -> GENE (with expression)
// ============================================
// EXP001 - NAFLD signature
MATCH (e:Experiment {sid: "EXP001"}), (g:Gene {symbol: "PIK3CG"})
MERGE (e)-[:HAS_VALUE {foldChange: 2.5, pValue: 0.001, regulated: "up", baseMean: 1250.3}]->(g);
MATCH (e:Experiment {sid: "EXP001"}), (g:Gene {symbol: "CXCL10"})
MERGE (e)-[:HAS_VALUE {foldChange: 3.2, pValue: 0.0005, regulated: "up", baseMean: 890.5}]->(g);
MATCH (e:Experiment {sid: "EXP001"}), (g:Gene {symbol: "CD36"})
MERGE (e)-[:HAS_VALUE {foldChange: 2.8, pValue: 0.0008, regulated: "up", baseMean: 3200.1}]->(g);
MATCH (e:Experiment {sid: "EXP001"}), (g:Gene {symbol: "ALB"})
MERGE (e)-[:HAS_VALUE {foldChange: -1.5, pValue: 0.02, regulated: "down", baseMean: 45000.8}]->(g);
// EXP002 - T2D signature
MATCH (e:Experiment {sid: "EXP002"}), (g:Gene {symbol: "MTOR"})
MERGE (e)-[:HAS_VALUE {foldChange: -1.8, pValue: 0.01, regulated: "down", baseMean: 1580.2}]->(g);
MATCH (e:Experiment {sid: "EXP002"}), (g:Gene {symbol: "AKT1"})
MERGE (e)-[:HAS_VALUE {foldChange: 2.1, pValue: 0.002, regulated: "up", baseMean: 2100.4}]->(g);
MATCH (e:Experiment {sid: "EXP002"}), (g:Gene {symbol: "PPARG"})
MERGE (e)-[:HAS_VALUE {foldChange: -2.3, pValue: 0.0003, regulated: "down", baseMean: 980.6}]->(g);
MATCH (e:Experiment {sid: "EXP002"}), (g:Gene {symbol: "CXCL8"})
MERGE (e)-[:HAS_VALUE {foldChange: 2.9, pValue: 0.0006, regulated: "up", baseMean: 1340.2}]->(g);
// EXP003 - Metabolic Syndrome signature
MATCH (e:Experiment {sid: "EXP003"}), (g:Gene {symbol: "CD36"})
MERGE (e)-[:HAS_VALUE {foldChange: 3.5, pValue: 0.0001, regulated: "up", baseMean: 2890.7}]->(g);
MATCH (e:Experiment {sid: "EXP003"}), (g:Gene {symbol: "PIK3CG"})
MERGE (e)-[:HAS_VALUE {foldChange: 1.9, pValue: 0.004, regulated: "up", baseMean: 1100.3}]->(g);
// ============================================
// RELATIONSHIPS: COMPARISON -> GENE (DGE Results)
// ============================================
// COMP001 results
MATCH (c:Comparison {sid: "COMP001"}), (g:Gene {symbol: "PIK3CG"})
MERGE (c)-[:FOUND_DIFFERENTIAL {
logFC: 2.5,
pValue: 0.001,
adjPValue: 0.015,
regulated: "up",
significance: "significant"
}]->(g);
MATCH (c:Comparison {sid: "COMP001"}), (g:Gene {symbol: "CXCL10"})
MERGE (c)-[:FOUND_DIFFERENTIAL {
logFC: 3.2,
pValue: 0.0005,
adjPValue: 0.008,
regulated: "up",
significance: "significant"
}]->(g);
MATCH (c:Comparison {sid: "COMP001"}), (g:Gene {symbol: "CD36"})
MERGE (c)-[:FOUND_DIFFERENTIAL {
logFC: 2.8,
pValue: 0.0008,
adjPValue: 0.012,
regulated: "up",
significance: "significant"
}]->(g);
// COMP002 results
MATCH (c:Comparison {sid: "COMP002"}), (g:Gene {symbol: "MTOR"})
MERGE (c)-[:FOUND_DIFFERENTIAL {
logFC: -1.8,
pValue: 0.01,
adjPValue: 0.045,
regulated: "down",
significance: "significant"
}]->(g);
MATCH (c:Comparison {sid: "COMP002"}), (g:Gene {symbol: "AKT1"})
MERGE (c)-[:FOUND_DIFFERENTIAL {
logFC: 2.1,
pValue: 0.002,
adjPValue: 0.018,
regulated: "up",
significance: "significant"
}]->(g);
// COMP008 - Meta-analysis (shared signatures)
MATCH (c:Comparison {sid: "COMP008"}), (g:Gene {symbol: "PIK3CG"})
MERGE (c)-[:FOUND_DIFFERENTIAL {
logFC: 2.2,
pValue: 0.0001,
adjPValue: 0.005,
regulated: "up",
significance: "significant",
note: "Shared across NAFLD and MetSyn"
}]->(g);
// ============================================
// RELATIONSHIPS: GENE -> PROTEIN
// ============================================
MATCH (g:Gene {symbol: "PIK3CG"}), (p:Protein {sid: "P48736"})
MERGE (g)-[:CODES]->(p);
MATCH (g:Gene {symbol: "CXCL10"}), (p:Protein {sid: "P02778"})
MERGE (g)-[:CODES]->(p);
MATCH (g:Gene {symbol: "MTOR"}), (p:Protein {sid: "P42345"})
MERGE (g)-[:CODES]->(p);
MATCH (g:Gene {symbol: "AKT1"}), (p:Protein {sid: "P31749"})
MERGE (g)-[:CODES]->(p);
MATCH (g:Gene {symbol: "PPARG"}), (p:Protein {sid: "P37231"})
MERGE (g)-[:CODES]->(p);
MATCH (g:Gene {symbol: "CD36"}), (p:Protein {sid: "P16671"})
MERGE (g)-[:CODES]->(p);
MATCH (g:Gene {symbol: "ALB"}), (p:Protein {sid: "P02768"})
MERGE (g)-[:CODES]->(p);
// ============================================
// RELATIONSHIPS: GENE -> ID
// ============================================
MATCH (g:Gene {symbol: "PIK3CG"}), (id:ID {sid: "5294"})
MERGE (g)-[:MAPPED]->(id);
MATCH (g:Gene {symbol: "CXCL10"}), (id:ID {sid: "3627"})
MERGE (g)-[:MAPPED]->(id);
MATCH (g:Gene {symbol: "MTOR"}), (id:ID {sid: "2475"})
MERGE (g)-[:MAPPED]->(id);
MATCH (g:Gene {symbol: "AKT1"}), (id:ID {sid: "207"})
MERGE (g)-[:MAPPED]->(id);
MATCH (g:Gene {symbol: "PPARG"}), (id:ID {sid: "5468"})
MERGE (g)-[:MAPPED]->(id);
// ============================================
// RELATIONSHIPS: GENE -> DISEASE
// ============================================
MATCH (g:Gene {symbol: "PIK3CG"}), (d:Disease {sid: "MONDO:0005359"})
MERGE (g)-[:RELATED_TO {source: "DisGeNET", score: 0.75}]->(d);
MATCH (g:Gene {symbol: "PPARG"}), (d:Disease {sid: "MONDO:0005015"})
MERGE (g)-[:RELATED_TO {source: "OpenTargets", score: 0.85}]->(d);
MATCH (g:Gene {symbol: "MTOR"}), (d:Disease {sid: "MONDO:0005015"})
MERGE (g)-[:RELATED_TO {source: "DisGeNET", score: 0.68}]->(d);
MATCH (g:Gene {symbol: "CD36"}), (d:Disease {sid: "MONDO:0011382"})
MERGE (g)-[:RELATED_TO {source: "OpenTargets", score: 0.72}]->(d);
MATCH (g:Gene {symbol: "AKT1"}), (d:Disease {sid: "MONDO:0005015"})
MERGE (g)-[:RELATED_TO {source: "DisGeNET", score: 0.81}]->(d);
// ============================================
// RELATIONSHIPS: PROTEIN -> GO
// ============================================
MATCH (p:Protein {sid: "P48736"}), (go:GO {sid: "GO:0008286"})
MERGE (p)-[:ASSOCIATED_WITH {source: "GO"}]->(go);
MATCH (p:Protein {sid: "P02778"}), (go:GO {sid: "GO:0006954"})
MERGE (p)-[:ASSOCIATED_WITH {source: "GO"}]->(go);
MATCH (p:Protein {sid: "P42345"}), (go:GO {sid: "GO:0008286"})
MERGE (p)-[:ASSOCIATED_WITH {source: "GO"}]->(go);
MATCH (p:Protein {sid: "P31749"}), (go:GO {sid: "GO:0008286"})
MERGE (p)-[:ASSOCIATED_WITH {source: "GO"}]->(go);
MATCH (p:Protein {sid: "P37231"}), (go:GO {sid: "GO:0005158"})
MERGE (p)-[:ASSOCIATED_WITH {source: "GO"}]->(go);
MATCH (p:Protein {sid: "P16671"}), (go:GO {sid: "GO:0006629"})
MERGE (p)-[:ASSOCIATED_WITH {source: "GO"}]->(go);
MATCH (p:Protein {sid: "P02768"}), (go:GO {sid: "GO:0006955"})
MERGE (p)-[:ASSOCIATED_WITH {source: "GO"}]->(go);
// ============================================
// RELATIONSHIPS: PROTEIN-PROTEIN INTERACTIONS
// ============================================
MATCH (p1:Protein {sid: "P48736"}), (p2:Protein {sid: "P31749"})
MERGE (p1)-[:INTERACTS_WITH {source: "STRING", score: 0.9}]->(p2);
MATCH (p1:Protein {sid: "P31749"}), (p2:Protein {sid: "P42345"})
MERGE (p1)-[:INTERACTS_WITH {source: "STRING", score: 0.95}]->(p2);
MATCH (p1:Protein {sid: "P31749"}), (p2:Protein {sid: "P37231"})
MERGE (p1)-[:INTERACTS_WITH {source: "STRING", score: 0.78}]->(p2);
MATCH (p1:Protein {sid: "P16671"}), (p2:Protein {sid: "P48736"})
MERGE (p1)-[:INTERACTS_WITH {source: "STRING", score: 0.65}]->(p2);
Cypher 查询
这些示例 Cypher 查询演示了如何检索和分析存储在图数据库中的单组学实验数据。
返回实验数据
在存储了实验数据后,能够查询并检索相关信息至关重要。
查找给定比较中所有差异表达的基因
在此查询中,我们选取特定的 `Comparison`(比较)节点(通过其 `sid` 属性标识),并查找该比较中所有差异表达的关联 `Gene` 节点(因为它们具有 `FOUND_DIFFERENTIAL` 关系)。我们根据调整后的 p 值阈值(例如 < 0.05)对结果进行过滤,以确定具有统计学意义的基因。查询返回基因符号、log 倍数变化、p 值、调整后的 p 值以及调控方向(上调或下调)。
// Find all genes differentially expressed in the NAFLD vs Control comparison
WITH
"COMP001" AS sid,
0.05 AS adjPValueThreshold
MATCH (comp:Comparison {sid: sid})-[r:FOUND_DIFFERENTIAL]->(gene:Gene)
WHERE r.adjPValue < adjPValueThreshold
RETURN
gene.symbol AS Gene,
r.logFC AS LogFoldChange,
r.pValue AS PValue,
r.adjPValue AS AdjustedPValue,
r.regulated AS Direction
ORDER BY r.adjPValue;
查找给定比较中所有过表达的基因
选取特定的 `Comparison` 节点(通过其 `sid` 属性标识),我们使用过滤器(`adjPValue < 0.05` 且 `regulated = "up"`)来查找所有相关的 `Gene` 节点,这些节点表现出过表达且这种过表达具有统计学意义。
// Find all genes overexpressed in the NAFLD vs Control comparison
WITH
"COMP001" AS sid,
0.05 AS adjPValueThreshold,
"up" AS regulationDirection
MATCH (comp:Comparison {sid: sid})-[r:FOUND_DIFFERENTIAL]->(gene:Gene)
WHERE r.adjPValue < adjPValueThreshold AND r.regulated = regulationDirection
RETURN
gene.symbol AS Gene,
r.logFC AS LogFoldChange,
r.pValue AS PValue,
r.adjPValue AS AdjustedPValue,
r.regulated AS Direction
ORDER BY r.adjPValue;
汇总疾病的实验数据
以疾病为中心的视角有助于理解跨多个实验与特定疾病相关的分子特征。
查找在多个比较中都过表达的所有基因
对于此查询,我们从 `Gene` 节点开始,寻找那些在多个 `Comparison` 节点中被发现过表达(即 `regulated = "up"`)的基因。我们统计每个基因被发现过表达的不同比较次数,并进行过滤,仅包含在至少两个比较中过表达的基因。结果包括基因符号、过表达次数以及过表达所属的比较名称。
WITH
0.05 AS adjPValueThreshold,
"up" AS regulationDirection
MATCH (gene:Gene)<-[r:FOUND_DIFFERENTIAL]-(comp:Comparison)
WHERE r.regulated = regulationDirection AND r.adjPValue < adjPValueThreshold
WITH gene, count(DISTINCT comp) AS compCount, collect(comp.name) AS comparisons
WHERE compCount >= 2
RETURN
gene.symbol AS Gene,
compCount AS TimesOverexpressed,
comparisons AS OverexpressedInComparisons
ORDER BY compCount DESC;
比较两种疾病之间的基因特征
在这里,我们旨在比较两种疾病之间的基因表达特征。我们匹配在两种已知疾病之间存在差异表达的 `Gene` 节点。
// Compare gene signatures between two diseases
WITH "significant" AS significanceLevel
MATCH
(gene:Gene)<-[r1:FOUND_DIFFERENTIAL]-(comp1:Comparison)-[:STUDIES_DISEASE]->(d1:Disease {name: "Non-alcoholic fatty liver disease"}),
(gene)<-[r2:FOUND_DIFFERENTIAL]-(comp2:Comparison)-[:STUDIES_DISEASE]->(d2:Disease {name: "Type 2 Diabetes"})
WHERE
r1.significance = significanceLevel
AND r2.significance = significanceLevel
RETURN
gene.symbol AS SharedGene,
r1.logFC AS NAFLD_LogFC,
r2.logFC AS T2D_LogFC,
r1.regulated AS NAFLD_Direction,
r2.regulated AS T2D_Direction;
这可以扩展为查找与给定基因关联的“所有”疾病,并比较它们的特征。
WITH
"significant" AS significanceLevel
MATCH
(gene:Gene)<-[r1:FOUND_DIFFERENTIAL]-(comp1:Comparison)-[:STUDIES_DISEASE]->(d1:Disease),
(gene)<-[r2:FOUND_DIFFERENTIAL]-(comp2:Comparison)-[:STUDIES_DISEASE]->(d2:Disease)
WHERE
r1.significance = significanceLevel
AND r2.significance = significanceLevel
AND d1 <> d2
AND d1.name < d2.name
RETURN
gene.symbol AS SharedGene,
d1.name,
r1.logFC AS NAFLD_LogFC,
r1.regulated AS NAFLD_Direction,
d2.name,
r2.logFC AS T2D_LogFC,
r2.regulated AS T2D_Direction;
收集感兴趣基因的信息
这些查询更偏向以基因为中心,侧重于检索与特定感兴趣基因(或多个基因)相关的各种类型信息。
返回给定基因的所有同义词
基因在不同的数据库和资源中命名并不统一。为了帮助集成来自多个来源的数据,检索给定基因的所有已知同义词是非常有用的。存储这些同义词还可以让我们将可能使用不同名称的实验结果映射回我们正在使用的基因名称。
// Find all synonyms for the gene PIK3CG
WITH "PIK3CG" AS geneSymbol
MATCH (g:Gene {symbol: geneSymbol})-[:MAPPED]->(syn:ID)
RETURN syn.sid AS ID, syn.source AS Source
ORDER BY syn.name;
展示给定基因的有趣结果
有趣的实验结果是指与目标疾病相关的差异表达。在这里,我们从一个特定的基因开始,查找该基因被发现差异表达的所有比较,以及相关的疾病和相关的统计数据。
// Show interesting result for a given gene
WITH "PIK3CG" AS geneSymbol
MATCH (g:Gene {symbol: geneSymbol})<-[:FOUND_DIFFERENTIAL]-(c:Comparison)-[:STUDIES_DISEASE]->(d:Disease)
RETURN g.symbol AS Gene,
d.name AS Disease,
r.logFC AS LogFoldChange,
r.pValue AS PValue,
r.adjPValue AS AdjustedPValue,
r.regulated AS Direction;
展示特定组织类型的有趣结果
从特定的组织类型(例如“肝脏”)开始,我们查找从该组织采集的所有样本以及相关的实验。从那里,我们遍历到在这些实验中测量的基因,并返回每个基因的相关统计数据。
// Show interesting results for a specific tissue type
WITH "liver" AS tissueName
MATCH (t:Tissue {name: tissueName})<-[:TAKEN_FROM]-(s:Sample)-[:HAS_EXPERIMENT]->(e:Experiment)-[r:HAS_VALUE]->(g:Gene)
RETURN
g.symbol AS Gene,
t.name AS Tissue,
r.logFC AS LogFoldChange,
r.pValue AS PValue,
r.adjPValue AS AdjustedPValue,
r.regulated AS Direction;
跨基因和蛋白质进行集成
我们的查询可以跨基因和蛋白质进行集成,利用基因-蛋白质编码关系和蛋白质-蛋白质相互作用关系。
查找候选基因靶点的网络邻域
我们从一个感兴趣的候选基因(例如 "PIK3CG")开始,并从 `Gene` 节点遍历到关联的 `Protein` 节点。从那里,我们通过遵循 `INTERACTS_WITH` 关系来探索蛋白质-蛋白质相互作用网络,到达邻近的蛋白质。最后,我们返回目标基因及其相邻基因的基因符号,以及蛋白质之间的相互作用得分。
// Find the network neighborhood of a candidate gene target
WITH "PIK3CG" AS geneSymbol
MATCH (g:Gene {symbol: geneSymbol})-[:CODES]->(p:Protein)-[i:INTERACTS_WITH]-(neighbor:Protein)<-[:CODES]-(ng:Gene)
RETURN
g.symbol AS TargetGene,
ng.symbol AS NeighborGene,
neighbor.sid AS NeighborProtein,
i.score AS InteractionScore
ORDER BY i.score DESC;
从比较到蛋白质相互作用追踪调控基因的网络邻域
在此查询中,我们从 `Comparison` 节点(通过其 `sid` 属性标识)开始,查找在该比较中差异表达的所有 `Gene` 节点。从这些基因中的每一个,我们遍历到对应的 `Protein` 节点,然后探索它们与网络中其他蛋白质的相互作用。最后,我们返回其蛋白质发生相互作用的基因对,以及相互作用得分。
// Trace network neighborhood of regulated genes from comparison to protein interactions
WITH "COMP001" AS comparisonSid
MATCH
(comp:Comparison {sid: comparisonSid})-[:FOUND_DIFFERENTIAL]->(g1:Gene),
(g1)-[:CODES]->(p1:Protein)-[i:INTERACTS_WITH]->(p2:Protein),
(p2)<-[:CODES]-(g2:Gene)
RETURN
g1.symbol AS Gene1,
g2.symbol AS Gene2,
i.score AS InteractionScore;
查找疾病中受调控基因的富集通路
富集通路分析有助于识别在与疾病相关的差异表达基因中过度代表的生物过程。此查询从特定的目标疾病(例如“非酒精性脂肪性肝病”)开始,查找在研究该疾病的比较中差异表达的所有基因,并返回相关的生物通路(GO 条目)以及每个通路中涉及的基因计数。
// Find enriched pathways in the NAFLD vs Control comparison
WITH "Non-alcoholic fatty liver disease" as diseaseName
MATCH
(d:Disease {name: diseaseName})<-[:STUDIES_DISEASE]-(comp)-[:FOUND_DIFFERENTIAL]->(gene:Gene),
(gene)-[:CODES]->(protein:Protein)-[:ASSOCIATED_WITH]->(go:GO)
WITH go, count(DISTINCT gene) AS geneCount
//WHERE geneCount >= 2 // uncomment to filter for pathways with at least 2 genes
RETURN
go.name AS Pathway,
go.sid AS GO_ID,
geneCount AS GenesInPathway
ORDER BY geneCount DESC;