我想在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
感谢您的关注。
答案 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
<强>返回强>
答案 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)
我认为此查询适合您。