我对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


我的查询将涉及通过ChrStartEnd进行搜索,以显示哪些调用者具有这些坐标,以及通过基因进行搜索。但是我的疑问是如何创建表。我可以用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/

10-12 02:39