異なる要素間の連絡先を保存しています。特定のタイプの要素を削除し、削除された要素によって相互接続された要素の新しい接点を保存したいと考えています。
問題の背景
この問題を想像してみてください。他の分子と接触している水分子があります (接触が水素結合の場合、水の周りに他の 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を持つ2つの連絡先を見つけようとすると、連絡先が重複してしまいます(CDとDC)。
重複することなく 6 つの連絡先すべてを取得する簡単な方法はありますか?
これらの 6 つの必要な行だけを取得する 1 ページの長さの SQL クエリを夢見ています。:-)
ただし、他のアイデアは大歓迎です。
誰がドナーであるかに関する情報を保存することが望ましいですが (可能な場合)、厳密に必要というわけではありません。
この質問をここまで読んでくださった皆様、本当にありがとうございました。