Я храню контакты между различными элементами. Я хочу исключить элементы определенного типа и сохранить новые контакты элементов, которые были связаны исключенным элементом.
Проблемный фон
Представьте себе эту проблему. У вас есть молекула воды, которая находится в контакте с другими молекулами (если контакт представляет собой водородную связь, вокруг моей воды может быть еще 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.
Структура базы данных
В настоящее время у меня есть следующая структура в базе данных:
Таблица 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 для опосредованного водой)
- другие столбцы о контакте, например расстояние
EDIT:
Как бы выглядели данные в случае, изображенном ранее.
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.
Таким образом, я явно не могу создать контакты C-D и A-B (остальные 4 в порядке).
Если я попробую подобный подход - пытаясь найти два контакта с одинаковым donor_id, я получу дубликаты контактов (C-D и D-C).
Есть ли простой способ восстановить все шесть контактов без дубликатов?
Мне снится какой-то одностраничный SQL-запрос, который извлекает только эти шесть искомых строк. : -)
Тем не менее, любые другие идеи приветствуются.
Желательно сохранить информацию о том, кто является донором (где это возможно), но не является строго обязательным.
Большое спасибо всем, кто прочитал этот вопрос на данный момент.