首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL PageRank实现

SQL PageRank实现
EN

Stack Overflow用户
提问于 2013-07-22 12:45:06
回答 2查看 3K关注 0票数 3

有一个很好的SQL PageRank实现吗?我看过http://www.databasedevelop.com/197517/,但是它缺乏清晰和正确的语法(T)。

在我们进行此操作时,有人知道上面的链接使用的是什么类型的SQL吗?SQL使用的是“在随机的位置”,“在哪里”之后没有任何东西,那个奇怪的at关键字,等等?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-12 22:39:39

我刚刚在SQL中实现了PageRank算法。该算法在后续的过程中工作。

1.计算PageRank初始秩值;

2.将PageRank表与边缘表连接起来,向相邻节点发出秩值,并使用聚合函数“收集”接收到的值。然后,将结果保存到寺庙表TmpRank

  1. 交换PageRankTmpRank的内容,然后进入步骤2,直到满足收敛条件或达到最大迭代时间为止。

以下是代码:

代码语言:javascript
复制
-- The graph data and algorithm source from the book "Mining of Massive Datasets", P175, http://infolab.stanford.edu/~ullman/mmds/book.pdf
-- This script has been verified the correctness in SQL Server 2017 Linux Version.
DROP TABLE Node;
DROP TABLE Edge;
DROP TABLE OutDegree;
DROP TABLE PageRank;
CREATE TABLE Node(id int PRIMARY KEY);
CREATE TABLE Edge(src int,dst int, PRIMARY KEY (src, dst));
CREATE TABLE OutDegree(id int PRIMARY KEY, degree int);
CREATE TABLE PageRank(id int PRIMARY KEY, rank float);
CREATE TABLE TmpRank(id int PRIMARY KEY, rank float);

--delete all records
DELETE FROM Node;
DELETE FROM Edge;
DELETE FROM OutDegree;
DELETE FROM PageRank;
DELETE FROM TmpRank;

--init basic tables
INSERT INTO Node VALUES (0);
INSERT INTO Node VALUES (1);
INSERT INTO Node VALUES (2);
INSERT INTO Node VALUES (3);

INSERT INTO Edge VALUES (0, 1);
INSERT INTO Edge VALUES (0, 2);
INSERT INTO Edge VALUES (0, 3);
INSERT INTO Edge VALUES (1, 0);
INSERT INTO Edge VALUES (1, 3);
INSERT INTO Edge VALUES (2, 2);
INSERT INTO Edge VALUES (3, 1);
INSERT INTO Edge VALUES (3, 2);

--compute out-degree
INSERT INTO OutDegree
SELECT Node.id, COUNT(Edge.src) --Count(Edge.src) instead of Count(*) for count no out-degree edge
FROM Node LEFT OUTER JOIN Edge
ON Node.id = Edge.src
GROUP BY Node.id;

--WARN: There's no special process for node with out-degree, This may cause wrong result
--      Please to make sure every node in graph has out-degree

DECLARE @ALPHA float = 0.8;
DECLARE @Node_Num int;
SELECT @Node_Num = COUNT(*) FROM Node;

--PageRank Init Value
INSERT INTO PageRank
SELECT Node.id, rank = (1 - @ALPHA) / @Node_Num
FROM Node INNER JOIN OutDegree
ON Node.id = OutDegree.id

/*
--For Debugging
SELECT * FROM Node;
SELECT * FROM Edge;
SELECT * FROM OutDegree;
SELECT * FROM PageRank;
SELECT * FROM TmpRank;
*/

DECLARE @Iteration int = 0;

WHILE @Iteration < 50
BEGIN
--Iteration Style
    SET @Iteration = @Iteration + 1

    INSERT INTO TmpRank
    SELECT Edge.dst, rank = SUM(@ALPHA * PageRank.rank / OutDegree.degree) + (1 - @ALPHA) / @Node_Num
    FROM PageRank
    INNER JOIN Edge ON PageRank.id = Edge.src
    INNER JOIN OutDegree ON PageRank.id = OutDegree.id
    GROUP BY Edge.dst

    DELETE FROM PageRank;
    INSERT INTO PageRank
    SELECT * FROM TmpRank;
    DELETE FROM TmpRank;
END

SELECT * FROM PageRank;
票数 6
EN

Stack Overflow用户

发布于 2013-11-13 22:25:39

根据Server版本的不同,请查看OFFSET_FETCH窗口函数。这里有很多页面排名应用程序。当然,这需要2012年的时间。

我还使用了SSIS和NTILE()划分的临时表来完成分页,这与使用OFFSET_FETCH的能力无关。通常使用类似于记录计数除以我希望在页面中看到的某个最大值作为NTILE调用的种子。

无论什么原因,我都不能打开你的链接,所以希望这是你的要求。

去取

MSDN - NTILE

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17787944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档