PostgreSQL ,
生物科学中相当重要的工作之一解开遗传密码?
欧式空间计算,是其中的一个需求,很有意思吧,PostgreSQL可以用来解开遗传密码。
<a href="https://en.wikipedia.org/wiki/Euclidean_distance">https://en.wikipedia.org/wiki/Euclidean_distance</a>
<a href="https://www.math.uci.edu/~gpatrick/source/205b06/chapviii.pdf">https://www.math.uci.edu/~gpatrick/source/205b06/chapviii.pdf</a>
实际上PostgreSQL是一个扩展性非常强大的数据库,比如在文本相似计算方面,就有诸多扩展插件。
<a href="https://github.com/digoal/blog/blob/master/201705/20170524_01.md">《17种相似算法与GIN索引 - pg_similarity》</a>
<a href="https://github.com/eulerto/pg_similarity">https://github.com/eulerto/pg_similarity</a>
<a href="https://baike.baidu.com/item/%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E5%BA%A6%E9%87%8F/1274107?fromtitle=%E6%AC%A7%E6%B0%8F%E8%B7%9D%E7%A6%BB&fromid=1798948">https://baike.baidu.com/item/%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E5%BA%A6%E9%87%8F/1274107?fromtitle=%E6%AC%A7%E6%B0%8F%E8%B7%9D%E7%A6%BB&fromid=1798948</a>
<a href="https://github.com/digoal/blog/blob/master/201701/20170116_04.md">《PostgreSQL结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 3 rum, smlar应用场景分析》</a>
<a href="https://github.com/digoal/blog/blob/master/201701/20170116_03.md">《PostgreSQL结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 2 smlar插件详解》</a>
<a href="https://github.com/digoal/blog/blob/master/201701/20170116_02.md">《PostgreSQL结合余弦、线性相关算法 在文本、图片、数组相似 等领域的应用 - 1 文本(关键词)分析理论基础 - TF(Term Frequency 词频)/IDF(Inverse Document Frequency 逆向文本频率)》</a>
在基因科学方面,也有扩展插件应用:
<a href="https://github.com/digoal/blog/blob/master/201606/20160621_01.md">《为了部落 - 如何通过PostgreSQL基因配对,产生优良下一代》</a>
在化学分析方面,也有相似的插件:
<a href="http://www.rdkit.org/">http://www.rdkit.org/</a>
某个生物科技公司,有这样的一种需求:
每张表有几十万行,几万列,全部浮点类型,任意列勾选,计算欧氏距离等需求。
因为数据库设计限制,不能支持一张表几万列,不过PostgreSQL可以将多列存成数组。
1、DNA结构如下:
比如每行代表一个物种的测序数据。
2、生成随机浮点数组的函数,可以方便的生成测试数据。
3、生成50万条测试数据,每组2万浮点数。
数据大概占用86GB空间。
可以使用plpgsql创建计算两个浮点数组的欧式距离的函数,长度可以不一样,因为可能不同物种的遗传数据不一样,有的多,有的少。
如果使用C函数,性能会更好。
例子
通过这个函数,传入要计算的数组即可计算欧式距离。
这个主要用于部分计算,例如人类和猴子,在某一段的相似性,那么需要从这两条记录中,分别取出要计算的部分,重新组成两个数组,然后计算它们两的欧氏距离。
例子:
或
比如选中了100个物种,计算它们的任意组合的欧氏距离。
需要一些辅助函数:
1、组合去重函数,只去掉重复行。
2、组合去重函数,去掉按列值排序后的重复行。
3、比如选中了1,2,3,4这四种物种,如何得到他们的排列组合呢?
4、创建一个函数,用于计算输入组合物种的排列组合欧式距离。
计算例子:
输入5个物种的ID,返回这5个物种的排列组合欧式距离。
PostgreSQL是一个扩展性很好的数据库,内置了丰富的数据类型。
本例,使用函数编程、数组类型两个特性,解决了生物科学中的遗传计算的场景的疑难问题(上万列,任意组合计算排列组合的欧式距离)。
同时PostgreSQL还能支持并行计算,在重计算的场景,可以提高计算响应速度。