在SQL中实现K-mer / n-gram

时间:2017-08-20 01:47:29

标签: sql sql-server algorithm tsql

我想在SQL Server中实现k-mer / n-gram algoirthm。 (https://en.wikipedia.org/wiki/N-gram)。 在数据库中,我有数百万个蛋白质序列,我想找到k-mers作为数组。

作为一个例子; 对于ATATAGGTCGT | k=5,结果将是

1 | ATATA
2 | TATAG
3 | ATAGG
4 | TAGGT
5 | AGGTC
6 | GGTCG
7 | GTCGT

感谢您的关注。

2 个答案:

答案 0 :(得分:2)

考虑到您的数据量,也许这可能会更高效。

示例

Declare @YourTable table (ID int,SomeCol varchar(50))
Insert Into @YourTable values
(1,'ATATAGGTCGT')

Declare @K int =5
Declare @MaxNGram int = 10

;with cte as (
    Select Top (@MaxNGram) N = Row_Number() over (Order By (Select NULL)) From  master..spt_values n1
)
Select A.ID
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select N
                      ,S=Substring(A.SomeCol,N,@K)
                 From cte
             ) B
 Where len(S)=@K

<强>返回

enter image description here

答案 1 :(得分:1)

关于https://en.wikipedia.org/wiki/N-gram k或n是变量。那么用户函数将是将k或n作为输入参数的最佳解决方案。

IF object_id('dbo.nGram','IF') IS NOT NULL
  DROP FUNCTION dbo.nGram; 
GO

CREATE FUNCTION dbo.nGram(@s nvarchar(max),@ int)
RETURNS TABLE AS
  RETURN 
    WITH value AS(
       SELECT 2 p,LEFT(@s,@)g 
       WHERE LEN(@s)>=@ 
       UNION ALL
       SELECT p+1,SUBSTRING(@s,p,@)FROM value 
       WHERE LEN(@s)>p-2+@)
    SELECT g FROM value
GO
WITH t AS(
   SELECT s FROM(values('ATCGAAGGTCGT'),('AT'))t(s)
)
SELECT s,g FROM t OUTER APPLY dbo.nGram(s,2)

我认为此查询适合您。