我正在使用一个 mysql 数据库,其中包含一个带有基因组岛的表,格式如下:
+----+-------+----------+----------+-----------------------------------------------+
| id | chrom | start | end | line_string |
+----+-------+----------+----------+-----------------------------------------------+
| 1 | 1 | 36568608 | 36569851 | ?? ?o?A ?? ?p?A |
| 2 | 1 | 82313020 | 82313491 | ?? ????A ?? L??A |
+----+-------+----------+----------+-----------------------------------------------+
线串的格式为:GeomFromText('Linestring(chrom start, chrom end)')
“开始”和“结束”的数字指的是碱基对位置
我目前正在我的 python 脚本中选择岛屿与非岛屿区域,使用:
SELECT 'Island' as Island FROM islands
WHERE MBRIntersects(GeomFromText('Linestring(%d %d, %d %d)'), line_string)
UNION ALL SELECT 'non-Island' LIMIT 1 % (Chr, Start, Chr, End)
但是,我想修改此查询,将岛屿海岸和大陆架定义为:
岛屿海岸 - 来自岛屿的 2,000 个碱基对
岛屿架 - 来自岛屿的 2,000 至 4,000 个碱基对
最佳答案
我使用以下方法解决了这个问题:
SELECT 'Island' as Island FROM methylation.islands FORCE INDEX (locations)
WHERE MBRIntersects(GeomFromText('Linestring(%d %d, %d %d)'), line_string)
UNION ALL SELECT 'Shore' FROM methylation.islands FORCE INDEX (locations)
WHERE MBRIntersects(GeomFromText('Linestring(%d %d, %d %d)'), line_string)
UNION ALL SELECT 'Shelf' FROM methylation.islands FORCE INDEX (locations)
WHERE MBRIntersects(GeomFromText('Linestring(%d %d, %d %d)'), line_string)
UNION ALL SELECT 'Other' LIMIT 1
% (Chr, Start, Chr, End, Chr, Start-2000, Chr, End+2000, Chr, Start-4000, Chr, End+4000)
以这种方式,任何“岛屿”都会被列出,接下来如果它距岛屿 +/- 2,000 个碱基对,它会被列为“海岸”,接下来如果它是 +/- 4,000 个碱基对,它会被列为“海岸” “架子”。最后,其他一切都被视为“其他”。通过使用LIMIT 1
,仅返回第一个找到的术语。
关于python - 在 MySQL 查询中选择相交和侧翼区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532188/