我正在存储不同元素之间的联系人。我想消除某些类型的元素并存储由消除的元素互连的元素的新联系人。
问题背景
想象一下这个问题。你有一个水分子,它与其他分子接触(如果接触是氢键,我的水周围可能有 4 个其他分子)。如下图所示(A、B、C、D 是其他一些原子,点表示接触)。
A B
| |
H H
. .
O
/ \
H H
. .
C D
我有关于所有点的信息,我需要消除中心的水,并创建描述 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
contacts
:
donor_id|acceptor_id|directness
1 4 D
1 5 D
2 1 D
3 1 D
我需要从中制作
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")
当前解决方案(不足)
现在,我正在浏览所有具有donor.amino = "HOH"
. 在此示例中,这将从 C 和 D 中选择联系人。对于这些选定的联系人中的每一个,我查找与当前选定联系人中的联系人相同的联系人acceptor_id
。donor_id
根据这些信息,我创建了新联系人。最后,我删除了与 HOH 之间的所有联系人。
这样,我显然无法创建 CD 和 AB 联系人(其他 4 个都可以)。
如果我尝试类似的方法 - 尝试找到两个具有相同donor_id 的联系人,我最终会得到重复的联系人(CD 和 DC)。
有没有一种简单的方法来检索所有六个联系人而不重复?
我梦想着某个一页长的 SQL 查询只检索这六个想要的行。:-)
但是,欢迎任何其他想法。
最好保留有关谁是捐赠者的信息(如果可能),但不是绝对必要的。
非常感谢所有阅读此问题的人。