我对sqlite3
还是很陌生,但是我想用它来存储我拥有的一些基因组数据,因为从R进行操作需要花费很多时间。建立数据库后,我想进行一些基本查询,但是我的问题是,我不知道应该创建哪些表以进行适当的查询。
这是我的大桌子的样子:
Chr Start End Ref Alt Callers GATK_Illumina.counts GATK_Illumina.samples GATK_SOLiD.counts GATK_SOLiD.samples LIFE_SOLiD.counts LIFE_SOLiD.samples TVC_Ion.counts TVC_Ion.samples Func.refGene Gene.refGene
chr1 14948 14948 G A GATK_SOLiD 0.38 noSample 1.125 XK713 0.125 noSample 13.43 17E334|17E424|17H593|17J782|17J913|1B566 ncRNA_intronic;downstream WASH7P;DDX11L1
chr1 14948 14948 G A TVC_Ion 0.38 noSample 1.125 XK713 0.125 noSample 13.43 17E334|17E424|17H593|17J782|17J913|1B566 ncRNA_intronic;downstream WASH7P;DDX11L1
chr1 15820 15820 G T GATK_SOLiD 0.38 noSample 1.125 1E695 0.125 noSample 4.43 17E574|17H906|5K083B|6C418 ncRNA_exonic WASH7P
chr1 15820 15820 G T TVC_Ion 0.38 noSample 1.125 1E695 0.125 noSample 4.43 17E574|17H906|5K083B|6C418 ncRNA_exonic WASH7P
chr1 17452 17452 C T GATK_SOLiD 0.38 noSample 1.125 1H823 0.125 noSample 12.43 17G118|17G937|17H906|17J610|17M152|4E832|5C725|5F445|5F685|5H986|5J427 ncRNA_intronic;upstream WASH7P;MIR6859-1;MIR6859-2;MIR6859-3;MIR6859-4
chr1 17452 17452 C T TVC_Ion 0.38 noSample 1.125 1H823 0.125 noSample 12.43 17G118|17G937|17H906|17J610|17M152|4E832|5C725|5F445|5F685|5H986|5J427 ncRNA_intronic;upstream WASH7P;MIR6859-1;MIR6859-2;MIR6859-3;MIR6859-4
chr1 17538 17538 C A GATK_SOLiD 0.38 noSample 3.125 1E695|1H586|9J385 0.125 noSample 24.43 17C851B|17C918|17D521B|17E424|17F076 ncRNA_intronic;upstream WASH7P;MIR6859-1;MIR6859-2;MIR6859-3;MIR6859-4
chr1 17538 17538 C A TVC_Ion 0.38 noSample 3.125 1E695|1H586|9J385 0.125 noSample 24.43 17C851B|17C918|17D521B|17E424|17F076 ncRNA_intronic;upstream WASH7P;MIR6859-1;MIR6859-2;MIR6859-3;MIR6859-4
我的查询将涉及通过
Chr
,Start
,End
进行搜索,以显示哪些调用者具有这些坐标,以及通过基因进行搜索。但是我的疑问是如何创建表。我可以用Chr Start End Ref Alt Callers
创建一个表,但是如何与另一个具有样本或基因的表链接?坐标(Chr Start End
)可以链接多个样本或呼叫者。查询的示例是键入坐标并显示所有信息,然后按基因搜索并显示包含该基因的所有坐标
基本上,我想知道应该创建多少张表以及如何链接它们。我知道我的坐标表将是父表。
哪些元素应该是不同表中的键?
最佳答案
我对基因组一无所知,但是根据数据和您的描述,这似乎是几个1:n关系,并且您正在寻找使用主键/外键创建关系实体的方法。我不确定您对SQL的熟悉程度,可以在这里查看更多有关SQL的信息:https://www.w3schools.com/sql/
您可能要像这样创建表,但是如果还有其他1:n或n:n关系,则更是如此:
genes
gene_id, gene_name, data1, data2
// 1 gene -> many coords
gene_coords
gene_id, chr, start, end, data1, data2
// 1 coord -> many callers (and/or samples)
gene_callers // Are callers & samples 1:1?
gene_id, caller, sample
您可以使用类似以下内容的坐标&& chr来查询呼叫者:
SELECT gene_callers.callers FROM gene_callers
JOIN gene_coords ON gene_coords.gene_id = gene_callers.gene_id
WHERE gene_coords.start = 14948 AND gene_coords.end = 14948
AND gene_coords.chr = 'chr1';
我不确定是否要根据坐标范围查询多个基因,如果这样,则可能不希望将起始/结束值存储为相同的值,只需将其存储为坐标并在该字段上使用BETWEEN。例如,此查询还将获取您的基因数据。
SELECT gene.*, gene_callers.callers FROM gene_callers
JOIN gene ON gene.gene_id = gene_callers.gene_id
JOIN gene_coords ON gene_coords.gene_id = gene_callers.gene_id
WHERE gene_coords.coord BETWEEN 14948 AND 17538;
要通过基因名称获取呼叫者,您可以执行以下操作:
SELECT gene_callers.callers FROM gene_callers
JOIN gene ON gene.gene_id = gene_callers.gene_id
WHERE gene.gene_name = 'a_gene';
您可能需要根据任何空值和要查找的数据集来调整联接类型。如果样本与调用者的比例不是1:1,则可能需要为样本创建另一个表。希望我能正确解释您的数据,并且至少可以为您指明正确的方向。
关于sqlite - 如何在基因组数据库SQLite3中创建相关表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53914099/