我正在使用graph.pm并构建一个多边形的图形。每个顶点是dna序列id,每个有向边表示沿着转录物(RNA序列)的两个dna序列的相对位置。 例如,如果您有一个RNA序列,并且将它BLAT(对齐)与包含数百万个不同长度的dna序列的dna组装文件,您可能会发现RNA翻译的基因被分成两个或更多不同的DNA组装中的序列。 好消息是,您可以使用该RNA比对信息通过根据它们与RNA的比对来命令dna序列来重新组合基因。因此需要有向图。实际上,单个基因区域可以产生多个RNA,因此我们使用多图来捕获这些信息。
给定dna组件,其中以下dna序列没有特定顺序:
my ( `$dna_ff, $dna_fh, $dna_kl, $dna_dq, $dna_cg, $dna_rr, $dna_er, $dna_pz, $dna_aq, $dna_ne` ) = ( 1,2,3,4,5,6,7,8,9,10 );
有一个分裂基因由以下序列顺序表示:
$dna_aq, $dna_dq, $dna_er, $dna_ne, $dna_kl ( 9, 4, 7, 10, 3 )
所以我创建了一个简单的多边形图:
my $g = Graph->new(multiedged => 1);
我添加边缘。然而,这个基因由多个使用不同外显子的RNA代表,因此dna序列与该基因的RNA序列的比对不一定是一个简单的解释。
例如,
For RNA_1:
$dna_aq, $dna_dq, $dna_kl
For RNA_2:
$dna_dq, $dna_ne
For DNA_3:
$dna_er, $dna_kl
如果我使用RNA_1作为订购的基础,我们会错过$dna_er
和$dna_ne
。
考虑到RNA_2和RNA_3,我们可以看到,$dna_ne
之前或之后无法判断$dna_kl
是否出现,只是它们都在$dna_dq
之后。同样,我们知道$dna_er
出现在$dna_kl
之前,但我们不知道它后面会有什么序列,如果有的话。
$dna_dq --> $dna_kl
$dna_dq --> $dna_ne
$dna_er --> $dna_kl
然而,假设我们有第四个RNA告诉我们$dna_ne --> $dna_kl
。现在我们知道$dna_ne
位于$dna_dq
和$dna_kl
之间。我们仍然无法放置$dna_er
,但至少我们已经能够通过组合来自多个RNA序列的信息来接近正确的排序。
所以让我们添加边缘:
$g->add_edges($dna_aq, $dna_dq, $dna_dq, $dna_kl );
$g->add_edges($dna_dq, $dna_ne);
$g->add_edges($dna_er, $dna_kl);
$g->add_edges($dna_ne, $dna_kl);
# 9-4, 4-3
# 4-10
# 7-3
# 10-3
正确的顺序是9,4,10和3.我们不能放置7.
print "The graph is $g\n";
The graph is 10-3,4-10,4-3,7-3,9-4
我想要的是从图中返回正确的顶点rder。我尝试了拓扑排序。
my @ts = $g->topological_sort;
print qq[@ts\n];
但这会打印:7 9 4 10 3
。
所以这不是我想要的。在这种情况下,7不应该在有序顶点列表中,因为我们无法确定它的位置是否与其他序列相关。
问题:有谁知道这种类型的问题是什么。更重要的是,如何返回一个顶点数组,其中只包含那些可以完全确定其相对位置的顶点?谢谢。