Kra*_*rab 5 python sql sqlite algorithm bioinformatics
我在不同元素之间存储联系人.我想要消除某种类型的元素并存储由被删除元素互连的元素的新联系.
想象一下这个问题.你有一个水分子与其他分子接触(如果接触是氢键,我的水周围可能有4个其他分子).如下图所示(A,B,C,D是其他一些原子,点表示接触).
A B
| |
H H
. .
O
/ \
H H
. .
C D
Run Code Online (Sandbox Code Playgroud)
我有关于所有点的信息,我需要消除中心的水并创建描述AC,AD,AB,BC,BD和CD的接触的记录.
目前,我在数据库中有以下结构:
表atoms:
"id" integer PRIMARY KEY,"amino" char(3) NOT NULL, (HOH代表水或其他价值)表contacts:
"acceptor_id" integer NOT NULL, (原子靠近我的氢,这里是C或D)"donor_id" integer NOT NULL, (这里是A或B)"directness" char(1) NOT NULL, (这应该是D代表直接而W代表水介导)编辑:如何看待前面描述的案例中的数据.
atoms:
id|atom|amino
1 | O | HOH
2 | N | ARG <- atom A from image
3 | S | CYS <- B
4 | O | SER <- C
5 | N | ARG <- D
Run Code Online (Sandbox Code Playgroud)
contacts:
donor_id|acceptor_id|directness
1 4 D
1 5 D
2 1 D
3 1 D
Run Code Online (Sandbox Code Playgroud)
我需要从中做出
contacts:
donor_id|acceptor_id|directness
3 4 W <- B-C
3 5 W <- B-D
2 4 W <- A-C
2 5 W <- A-D
2 3 X <- A-B (These last two rows are escaping me,
4 5 X <- C-D there could be also row D-C, but not
both C-D and D-C. A char 'X' could
be used to mark "no donor/acceptor")
Run Code Online (Sandbox Code Playgroud)
现在,我正在浏览所有的联系人donor.amino = "HOH".在此示例的情况下,这将选择从C和D接触对于每个这些选择的联系人的,我查找具有相同触头acceptor_id由于是donor_id在当前选定的接触.根据这些信息,我创建了新的联系人.最后,我删除了HOH的所有联系人.
这样,我显然无法创建CD和AB联系人(其他4个都可以).
如果我尝试类似的方法 - 尝试找到具有相同donor_id的两个联系人,我最终会得到重复的联系人(CD和DC).
我正在梦想一些长一页的SQL查询,它只检索这六个想要的行.:-)
但是,欢迎任何其他想法.
最好保存关于谁是捐赠者(如果可能)的信息,但不是绝对必要的.
非常感谢所有读过这个问题的人.
好吧,很难在评论中提供示例,我决定发布答案:
如果必须遵循原始数据,则无法区分第一个结构的数据和第二个结构的数据。应该有一个附加的分组条件来消除第一和第二结构之间的方向。
sqlite> create table atoms (id INT, atom TEXT, amino TEXT);
sqlite> insert into atoms VALUES (1, 'O', 'HOH');
sqlite> insert into atoms VALUES (2, 'A', 'ARG');
sqlite> insert into atoms VALUES (3, 'B', 'CYS');
sqlite> insert into atoms VALUES (4, 'C', 'SER');
sqlite> insert into atoms VALUES (5, 'D', 'ARG');
sqlite> insert into atoms VALUES (6, 'O1', 'HOH');
sqlite> insert into atoms VALUES (7, 'A1', 'ARG');
sqlite> insert into atoms VALUES (8, 'B1', 'CYS');
sqlite> insert into atoms VALUES (9, 'C1', 'SER');
sqlite> insert into atoms VALUES (10, 'D1', 'ARG');
sqlite> select * from atoms;
1|O|HOH
2|A|ARG
3|B|CYS
4|C|SER
5|D|ARG
6|O1|HOH
7|A1|ARG
8|B1|CYS
9|C1|SER
10|D1|ARG
Run Code Online (Sandbox Code Playgroud)
UPD
这是原始数据:
sqlite> .headers ON
sqlite> .mode columns
sqlite> select * from atoms;
id atom amino
---------- ---------- ----------
1 O HOH
2 A ARG
3 B CYS
4 C SER
5 D ARG
6 O1 HOH
7 A1 ARG
8 B1 CYS
9 C1 SER
10 D1 ARG
sqlite> select * from contacts;
donor_id acceptor_id directness
---------- ----------- ----------
1 4 D
1 5 D
2 1 D
3 1 D
6 9 D
6 10 D
7 6 D
8 6 D
Run Code Online (Sandbox Code Playgroud)
这是查询:
select
c1.donor_id, c2.acceptor_id, 'W' as directness
from
contacts c1, contacts c2, atoms a
where
c1.acceptor_id = c2.donor_id
and c1.acceptor_id=a.id
and a.amino='HOH'
UNION ALL
select
c1.donor_id, c2.donor_id, 'X' as directness
from
contacts c1, contacts c2, atoms a
where
c1.acceptor_id = c2.acceptor_id
and c1.acceptor_id=a.id
and a.amino='HOH'
and c1.donor_id < c2.donor_id
UNION ALL
select
c1.acceptor_id, c2.acceptor_id, 'X' as directness
from
contacts c1, contacts c2, atoms a
where
c1.donor_id = c2.donor_id
and c1.donor_id=a.id
and a.amino='HOH'
and c1.acceptor_id < c2.acceptor_id;
Run Code Online (Sandbox Code Playgroud)
结果如下:
donor_id acceptor_id directness
---------- ----------- ----------
2 4 W
2 5 W
3 4 W
3 5 W
7 9 W
7 10 W
8 9 W
8 10 W
2 3 X
7 8 X
4 5 X
9 10 X
Run Code Online (Sandbox Code Playgroud)