2013-04-23 2 views
0

Я получаю доступ к базе данных mysql, структурированной в chado. Я ищу по продукту гена, для этого примера продукт представляет собой «бифункциональную ват-фукозасинтетазу: ВВП-4-дегидро-6-дезокси-D-маннозная эпимераза и ВВП-4-дегидро-6-L-дезоксигалактозоредуктаза».MySQL SUBSTRING с использованием заданных значений длины и позиции по сравнению с подстрокой языка программирования после извлечения

Я могу использовать инструкции JOIN, чтобы найти, на какой сборке находится этот ген, и каковы его координаты. Вышеуказанный оператор SQL действителен и вернет последовательность сборки (а не только последовательность генов) и начальную и конечную позиции для интересующего гена на сборке.

SELECT f.uniquename AS protein_accession, product.value AS protein_name, srcfeature.residues AS residue_sequence, srcassembly.name AS source_type, location.fmin AS location_min, location.fmax AS location_max, location.strand 
FROM feature f 
JOIN cvterm polypeptide ON f.type_id=polypeptide.cvterm_id 
JOIN featureprop product ON f.feature_id=product.feature_id 
JOIN cvterm productprop ON product.type_id=productprop.cvterm_id 
JOIN featureloc location ON f.feature_id=location.feature_id 
JOIN feature srcfeature ON location.srcfeature_id=srcfeature.feature_id 
JOIN cvterm srcassembly ON srcfeature.type_id=srcassembly.cvterm_id 
WHERE polypeptide.name = 'polypeptide' 
AND productprop.name = 'gene_product_name' 
AND product.value LIKE '%bifunctional GDP-fucose synthetase: GDP-4-dehydro-6-deoxy-D-mannose epimerase and GDP-4-dehydro-6-L-deoxygalactose reductase%'; 

Последовательность сборки очень длинная, и мне определенно не нужно все это. Лучше ли извлекать нужную часть, используя метод SUBSTRING MySQL, чтобы сохранить извлечение всей последовательности или использовать метод подстроки языка программирования после извлечения? Следующий запрос - это моя попытка метода SUBSTRING с использованием значений, полученных во время запроса для позиции и длины. Это не работает, я предполагаю, что для работы нужно несколько операторов SELECT. SQL становится действительно уродливым, и я даже не уверен, что рабочий конечный результат будет лучше.

Каковы ваши мысли, лучше ли это делать с помощью SQL SUBSTRING или просто использовать язык программирования и метод подстроки, чтобы отображать то, что я хочу, даже если бы я получил все это?

SELECT f.uniquename AS protein_accession, product.value AS protein_name, SUBSTRING(srcfeature.residues AS residue_sequence, location_min, location_max - location_min), srcassembly.name AS source_type, location.fmin AS location_min, location.fmax AS location_max, location.strand 
FROM feature f 
JOIN cvterm polypeptide ON f.type_id=polypeptide.cvterm_id 
JOIN featureprop product ON f.feature_id=product.feature_id 
JOIN cvterm productprop ON product.type_id=productprop.cvterm_id 
JOIN featureloc location ON f.feature_id=location.feature_id 
JOIN feature srcfeature ON location.srcfeature_id=srcfeature.feature_id 
JOIN cvterm srcassembly ON srcfeature.type_id=srcassembly.cvterm_id 
WHERE polypeptide.name = 'polypeptide' 
AND productprop.name = 'gene_product_name' 
AND product.value LIKE '%bifunctional GDP-fucose synthetase: GDP-4-dehydro-6-deoxy-D-mannose epimerase and GDP-4-dehydro-6-L-deoxygalactose reductase%'; 

РЕДАКТИРОВАТЬ Ниже приведен пример привести для другого гена (короче название). Я опустил часть в запрошенной последовательности, так как эта часть имеет длину в тысячи символов. Мне нужно было бы правильно использовать значения location_min и location_max, показанные здесь для SUBSTRING.

+-------------------+---------------------------------------------------+-------------+--------------+--------------+--------+ 
| protein_accession | protein_name          | source_type | location_min | location_max | strand | 
+-------------------+---------------------------------------------------+-------------+--------------+--------------+--------+ 
| ECDH10B_0026  | bifunctional riboflavin kinase and FAD synthetase | assembly |  21406 |  22348 |  1 | 
+-------------------+---------------------------------------------------+-------------+--------------+--------------+--------+ 

ответ

1

Ваш as был не в тех местах. Он должен пойти после закрытия Paren для substring():

SELECT f.uniquename AS protein_accession, product.value AS protein_name, 
     SUBSTRING(srcfeature.residues, location_min, location_max - location_min) AS residue_sequence, 
     srcassembly.name AS source_type, location.fmin AS location_min, location.fmax AS location_max, location.strand 
FROM feature f 
JOIN cvterm polypeptide ON f.type_id=polypeptide.cvterm_id 
JOIN featureprop product ON f.feature_id=product.feature_id 
JOIN cvterm productprop ON product.type_id=productprop.cvterm_id 
JOIN featureloc location ON f.feature_id=location.feature_id 
JOIN feature srcfeature ON location.srcfeature_id=srcfeature.feature_id 
JOIN cvterm srcassembly ON srcfeature.type_id=srcassembly.cvterm_id 
WHERE polypeptide.name = 'polypeptide' 
AND productprop.name = 'gene_product_name' 
AND product.value LIKE '%bifunctional GDP-fucose synthetase: GDP-4-dehydro-6-deoxy-D-mannose epimerase and GDP-4-dehydro-6-L-deoxygalactose reductase%'; 

Что касается другого вопроса, я думаю, что это имеет гораздо больше смысла, чтобы извлечь данные, которые вы хотите в запросе, а не передавая обратно ненужные данные в заявление. Это экономит накладные расходы. Кроме того, база данных имеет возможность запускаться параллельно, если она использует несколько потоков/процессоров.

+0

Это изменение имеет смысл. К сожалению, запрос все еще не работает. Я думаю, потому что location_min и location_max - это значения, которые генерируются из этого запроса. Вот почему я решил, что, вероятно, потребуется несколько операторов SELECT. Один для получения значений location_min и location_max, а затем один для использования их в SUBSTRING srcfeature.residues. Вот ошибка, которую MySQL дает мне, если я использую этот запрос, как указано выше: ERROR 1054 (42S22): Неизвестный столбец 'location_min' в 'списке полей' – sage88

+0

Итак, попытавшись сделать это, передайте всю последовательность и отредактируйте ее на стороне клиента в javascript, используя SQL SUBSTRING - это не только лучший способ сделать это, но и единственный способ сделать это. Последовательность настолько длинная, что не удается правильно загрузить ее, когда вы пытаетесь извлечь все это (и занимает около 15 секунд, чтобы отобразить что угодно). Поэтому я думаю, что вы указали мне в правильном направлении. – sage88

+1

@ sage88. , , Я думаю, что вы можете просто использовать 'location.fmin' и' location.fmax' вместо псевдонимов. –

0

Если что-то, как это будет работать для вас:

SELECT f.uniquename AS protein_accession, 
     product.value AS protein_name, 
     SUBSTRING(
        srcfeature.residues, 
        patindex('%SOMPATTERN%',srcfeature.residues), 
        LEN(srcfeature.residues) - patindex('%SOMPATTERN%',srcfeature.residues) 
       ) AS residue_sequence, 
     srcassembly.name AS source_type, 

затем попробовать, что в SQL. Если нет, используйте язык программирования приложений.

+0

Я не ищу конкретный образец. Мне нужно подстроить его значением индекса. Я опубликую, как выглядит запрос выше, без включенной последовательности, чтобы дать вам представление о том, о чем я говорю. – sage88

+0

Итак, как вы рассчитываете значение индекса? Что такое location_min и что такое location_max? Если они являются функциями чего-то в строке, вам нужно включить эту функцию в команду SUBSTRING, как и в PATINDEX(). Другими словами, если location_min = f (srcfeature.residues) и location_max = g (srcfeature.residues), вам нужно установить SUBSTRING (srcfeature.residues, f (srcfeature.residues), g (srcfeature.residues)) в запрос. Они должны быть функциями srcfeature.residues, иначе ваши location_min и location_max могут быть вне диапазона для длины srcefeature.residues. –

+0

Если location_min и location_max НЕ являются функциями чего-либо в строке, вы можете просто определить их как параметры хранимой процедуры или как скалярные значения 'code'DECLARE @Location_Min int' code'SET @Location_Min = 10 –

 Смежные вопросы

  • Нет связанных вопросов^_^