概述
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不同,例如:
- 文章不能引用自己,即网络中没有自环边。
- 两篇文章不能相互引用,即一篇文章不能既是另一篇文章的前链,又是它的后链。
- 一般已发表文章中的引用不会改变,即文章的前链是固定的。
示例图

在一个空图中运行以下语句定义图结构并插入数据:
ALTER GRAPH CURRENT_GRAPH ADD NODE {
book ()
};
ALTER GRAPH CURRENT_GRAPH ADD EDGE {
cite ()-[]->()
};
INSERT (book1:book {_id: "book1"}),
(book2:book {_id: "book2"}),
(book3:book {_id: "book3"}),
(book4:book {_id: "book4"}),
(book5:book {_id: "book5"}),
(book6:book {_id: "book6"}),
(book7:book {_id: "book7"}),
(book1)-[:cite]->(book4),
(book1)-[:cite]->(book5),
(book2)-[:cite]->(book4),
(book3)-[:cite]->(book4),
(book4)-[:cite]->(book5),
(book4)-[:cite]->(book6);
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-server-1
上,并命名为 my_hdc_graph
:
CREATE HDC GRAPH my_hdc_graph ON "hdc-server-1" OPTIONS {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static"
}
hdc.graph.create("my_hdc_graph", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static"
}).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("my_hdc_graph", {
return_id_uuid: "id",
init_value: 1,
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc"
}, {
file: {
filename: "article_rank"
}
})
algo(page_rank).params({
projection: "my_hdc_graph",
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("my_hdc_graph", {
loop_num: 50,
weaken: 2
}, {
db: {
property: "rank"
}
})
algo(page_rank).params({
projection: "my_hdc_graph",
loop_num: 50,
weaken: 2
}).write({
db:{
property: 'rank'
}
})
完整返回
CALL algo.page_rank.run("my_hdc_graph", {
return_id_uuid: "id",
init_value: 1,
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc",
limit: 3
}) 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 my_hdc_graph
结果:
_id | rank |
---|---|
book4 | 0.428308 |
book5 | 0.375926 |
book6 | 0.319926 |
流式返回
CALL algo.page_rank.stream("my_hdc_graph", {
return_id_uuid: "id",
loop_num: 50,
damping: 0.8,
weaken: 2,
order: "desc",
limit: 3
}) 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 my_hdc_graph
结果:
_id | rank |
---|---|
book4 | 0.428308 |
book5 | 0.375926 |
book6 | 0.319926 |