我对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有多熟悉,你可以在这里查看更多关于使用它的信息: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';
您可能需要根据任何null和您要查找的数据集调整连接类型。如果示例与调用方不是1:1,则可能需要为它们创建另一个表。希望我能正确解读你的数据,这至少能为你指明正确的方向。