gpt4 book ai didi

python - 优化存储在 SQLite 中的数据 - 如何加入多个联系人?

转载 作者:IT王子 更新时间:2023-10-29 06:29:21 31 4
gpt4 key购买 nike

我正在存储不同元素之间的联系。我想消除某种类型的元素并存储由消除的元素互连的元素的新联系。

问题背景

想象一下这个问题。你有一个水分子与其他分子接触(如果接触是氢键,我的水周围可能还有 4 个其他分子)。如下图所示(A、B、C、D 是其他一些原子,点表示接触)。

 A   B
| |
H H
. .
O
/ \
H H
. .
C D

我有所有点的信息,我需要去除中心的水并创建描述 A-C、A-D、A-B、B-C、B-D 和 C-D 接触的记录。

数据库结构

目前,我在数据库中有以下结构:

原子:

  • “id”整数主键,
  • "amino"char(3) NOT NULL,(HOH 表示水或其他值)
  • 识别原子的其他列

联系人:

  • "acceptor_id"integer NOT NULL,(靠近我的氢的原子,这里是 C 或 D)
  • "donor_id"integer NOT NULL,(此处为 A 或 B)
  • "directness"char(1) NOT NULL,(这应该是 D 表示直接,W 表示水介导)
  • 有关联系人的其他列,例如距离

编辑:前面描述的案例中的数据看起来如何。

原子:

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

联系人:

donor_id|acceptor_id|directness
1 4 D
1 5 D
2 1 D
3 1 D

我需要从中制作

联系人:

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 中选择联系人。对于这些选定的联系人中的每一个,我查找具有与当前 donor_id 相同的 acceptor_id 的联系人选定的联系人。根据这些信息,我创建了新联系人。最后,我删除了所有进出 HOH 的联系人。

这样,我显然无法创建 C-D 和 A-B 联系人(其他 4 个都可以)。

如果我尝试类似的方法 - 尝试找到具有相同 donor_id 的两个联系人,我最终会得到重复的联系人(C-D 和 D-C)。

有没有一种简单的方法可以检索所有六个联系人而不重复?

我梦想着一些一页长的 SQL 查询,它只检索这六个需要的行。 :-)
但是,欢迎任何其他想法。

最好保留有关谁是捐赠者的信息(如果可能),但并非绝对必要。

非常感谢所有阅读此问题的人。

最佳答案

您的解释有一个困难。

您从一个有向图开始,其中每条边代表连接 X=>Y,其中 X 是供体,Y 是受体。 atoms 表是该图的 SQL 表示。

您似乎想要的是未定向的东西。因此,链接 X-Y 意味着 X 和 Y 通过水分子(当然或其他一些物种)连接,但 X 和 Y 都可以是供体或受体。出于这个原因,您的最后一张表有歧义(您注意到),因此某些链接可能会以任何一种方式出现。在我看来,这意味着您最后一列中的列标题 donor_idacceptor_id 没有您所解释的任何含义。这当然可能是我的困惑。

如果你想要的只是一个包含所有 6 个链接的表格,每个链接为一行,但不要太担心跟踪捐赠者/接受者的事情,那么这在 sqlite3 中对我有用:

 create temporary view hoh_view as 
select donor_id as id, atoms.id as hoh_id from contacts, atoms
where acceptor_id=atoms.id and atoms.amino='HOH'
union select acceptor_id as id, atoms.id as hoh_id from contacts, atoms
where donor_id=atoms.id and atoms.amino='HOH';

select a.id, b.id from hoh_view as a, hoh_view as b
where a.id > b.id and a.hoh_id=b.hoh_id;

我使用临时 View 使事情更清楚的地方。如果您愿意,可以将对 hoh_view 的每个引用替换为第一个查询,从而将所有这些放入一个大查询中。我觉得有点讨厌,可能有办法整理它。

如果您确实想跟踪供体/受体关系,您需要解释当两个氨基酸都是受体或供体时您如何决定做什么(即示例中的最后两行)。

如果那不符合您的要求,那么也许我可以修复它,让它符合您的要求。

关于python - 优化存储在 SQLite 中的数据 - 如何加入多个联系人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2904205/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com