概述
ArticleRank(文章排名)起源于PageRank,用于实现对文章的影响力排名。
- J. Li, P. Willett, ArticleRank: a PageRank-based Alternative to Numbers of Citations for Analysing Citation Networks (2009)
基本概念
ArticleRank
与网页之间的链接类似,文章(书籍、报告等)之间的引用代表权威性和高质量。通常认为,一篇文章获得的引用次数越多,该文章在其特定研究领域内的影响就越大。
然而,并非所有文章都同等重要。因此,这种基于PageRank的文章排名方法被提出。
ArticleRank基本保留了PageRank的计算方法,同时也进行了一些修改。当一篇文章向其引用的文章传递排名时,不是将排名除以出度进行平均分配,而是除以该文章的出度和所有文章的平均出度之和。文章u在一次迭代后的排名为:
其中Bu是文章u的后链集合,d是阻尼系数。分母的这种变化能削弱那些出度很小的文章的贡献度。
嬴图的ArticleRank使用的分母与原始论文不同,但核心思想是相同的。
特殊说明
文章引用网络有一些特性与WWW不同,例如:
- 文章不能引用自己,即网络中没有自环边。
- 两篇文章不能相互引用,即一篇文章不能既是另一篇文章的前链,又是它的后链。
- 一般已发表文章中的引用不会改变,即文章的前链是固定的。
示例图集
创建示例图集:
// 在空图集中逐行运行以下语句
create().node_schema("book").edge_schema("cite")
insert().into(@book).nodes([{_id:"book1"}, {_id:"book2"}, {_id:"book3"}, {_id:"book4"}, {_id:"book5"}, {_id:"book6"}, {_id:"book7"}])
insert().into(@cite).edges([{_from:"book1", _to:"book4"}, {_from:"book1", _to:"book5"}, {_from:"book2", _to:"book4"}, {_from:"book3", _to:"book4"}, {_from:"book4", _to:"book5"}, {_from:"book4", _to:"book6"}])
在HDC图集上运行算法
创建HDC图集
将当前图集全部加载到HDC服务器hdc-server-1
上,并命名为 hdc_article_rank
:
CALL hdc.graph.create("hdc-server-1", "hdc_article_rank", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
})
hdc.graph.create("hdc_article_rank", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
}).to("hdc-server-1")
参数
算法名:page_rank
参数名 |
类型 |
规范 |
默认值 |
可选 |
描述 |
---|---|---|---|---|---|
init_value |
Float | >0 | 0.2 |
是 | 所有点的初始排名 |
loop_num |
Integer | ≥1 | 5 |
是 | 最大迭代轮数。算法将在完成所有轮次后停止 |
damping |
Float | (0,1) | 0.8 |
是 | 阻尼系数 |
weaken |
Integer | 1 , 2 |
1 |
是 | 设置为2 时计算ArticleRank;设置为1 时计算PageRank |
return_id_uuid |
String | uuid , id , both |
uuid |
是 | 在结果中使用_uuid 、_id 或同时使用两者来表示点 |
limit |
Integer | ≥-1 | -1 |
是 | 限制返回的结果数;-1 返回所有结果 |
order |
String | asc , desc |
/ | 是 | 根据rank 分值对结果排序 |
文件回写
CALL algo.page_rank.write("hdc_article_rank", {
params: {
return_id_uuid: "id",
init_value: 1,
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc"
},
return_params: {
file: {
filename: "article_rank"
}
}
})
algo(page_rank).params({
project: "hdc_article_rank",
return_id_uuid: "id",
init_value: 1,
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc"
}).write({
file: {
filename: "article_rank"
}
})
结果:
_id,rank
book4,0.428308
book5,0.375926
book6,0.319926
book2,0.2
book3,0.2
book7,0.2
book1,0.2
数据库回写
将结果中的rank
值写入指定点属性。该属性类型为float
。
CALL algo.page_rank.write("hdc_article_rank", {
params: {
loop_num: 50,
weaken: 2
},
return_params: {
db: {
property: "rank"
}
}
})
algo(page_rank).params({
project: "hdc_article_rank",
loop_num: 50,
weaken: 2
}).write({
db:{
property: 'rank'
}
})
完整返回
CALL algo.page_rank("hdc_article_rank", {
params: {
return_id_uuid: "id",
init_value: 1,
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc",
limit: 3
},
return_params: {}
}) YIELD AR
RETURN AR
exec{
algo(page_rank).params({
return_id_uuid: "id",
init_value: 1,
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc",
limit: 3
}) as AR
return AR
} on hdc_article_rank
结果:
_id | rank |
---|---|
book4 | 0.428308 |
book5 | 0.375926 |
book6 | 0.319926 |
流式返回
CALL algo.page_rank("hdc_article_rank", {
params: {
return_id_uuid: "id",
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc",
limit: 3
},
return_params: {
stream: {}
}
}) YIELD AR
RETURN AR
exec{
algo(page_rank).params({
return_id_uuid: "id",
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc",
limit: 3
}).stream() as AR
return AR
} on hdc_article_rank
结果:
_id | rank |
---|---|
book4 | 0.428308 |
book5 | 0.375926 |
book6 | 0.319926 |
在分布式投影上运行算法
创建分布式投影
将图集全部投影到shard服务器上并命名为dist_article_rank
:
create().projection("dist_article_rank", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true
})
参数
算法名:page_rank
参数名 |
类型 |
规范 |
默认值 |
可选 |
描述 |
---|---|---|---|---|---|
init_value |
Float | >0 | 0.2 |
是 | 所有点的初始排名 |
loop_num |
Integer | ≥1 | 10 |
是 | 最大迭代轮数。算法将在完成所有轮次后停止 |
damping |
Float | (0,1) | 0.8 |
是 | 阻尼系数 |
weaken |
Integer | 1 , 2 |
1 |
是 | 设置为2 时计算ArticleRank;设置为1 时计算PageRank |
limit |
Integer | ≥-1 | -1 |
是 | 限制返回的结果数;-1 返回所有结果 |
order |
String | asc , desc |
/ | 是 | 根据rank 分值对结果排序 |
文件回写
CALL algo.page_rank.write("dist_article_rank", {
params: {
init_value: 1,
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc"
},
return_params: {
file: {
filename: "article_rank"
}
}
})
algo(page_rank).params({
project: "dist_article_rank",
init_value: 1,
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc"
}).write({
file: {
filename: "article_rank"
}
})
结果:
_id,rank
book4,0.5999999999999999778
book5,0.52000000000000001776
book6,0.44000000000000000222
book7,0.2000000000000000111
book3,0.2000000000000000111
book2,0.2000000000000000111
book1,0.2000000000000000111
数据库回写
将结果中的rank
值写入指定点属性。该属性类型为double
。
CALL algo.page_rank.write("dist_article_rank", {
params: {
loop_num: 50,
weaken: 2
},
return_params: {
db: {
property: "rank"
}
}
})
algo(page_rank).params({
project: "dist_article_rank",
loop_num: 50,
weaken: 2
}).write({
db:{
property: 'rank'
}
})