概述
k-Core算法能识别图中最大的连通子图,其中所有节点的度不小于 k。它常用来识别和提取图中紧密连通的群组,以便做进一步分析。该算法广泛应用于金融风险控制、社交网络分析和生物学等多个研究领域。k-Core算法的主要优势之一是时间复杂度低(线性),因此能高效地处理大型图。此外,k-Core生成的子图具有良好的直观可解释性,有助于理解图的结构模式和关系。
普遍接受的k-Core概念最早是由Seidman提出的:
- S.B. Seidman, Network Structure And Minimum Degree. Soc Netw 5:269-287 (1983)
基本概念
k-Core
图的k-Core子图是通过迭代剪枝过程得到的。从原图开始,按顺序反复从图中去掉度小于k的节点,直到剩余节点的度均大于或等于k。
以下是获取图的3-core子图的修剪过程。在第一轮中,度数小于3的节点{a, d, f}被移除,这影响到节点b在第二轮中被移除。第二轮之后,所有剩余节点的度数都不少于3,因此修剪过程结束,该图的3-core是由节点{c, e, g, h}诱导的。

嬴图的k-Core算法识别图中每个连通分量的k-core子图。
特殊说明
- k-Core算法忽略图中的自环边。在计算相应节点的度时,不考虑它的自环边。
- k-Core算法忽略边的方向,按照无向边进行计算。
示例图

在一个空图中运行以下语句定义图结构并插入数据:
INSERT (A:default {_id: "A"}),
(B:default {_id: "B"}),
(C:default {_id: "C"}),
(D:default {_id: "D"}),
(E:default {_id: "E"}),
(F:default {_id: "F"}),
(G:default {_id: "G"}),
(H:default {_id: "H"}),
(I:default {_id: "I"}),
(A)-[:default]->(C),
(B)-[:default]->(B),
(B)-[:default]->(D),
(C)-[:default]->(B),
(C)-[:default]->(D),
(E)-[:default]->(D),
(E)-[:default]->(F),
(E)-[:default]->(G),
(E)-[:default]->(H),
(F)-[:default]->(D),
(G)-[:default]->(D),
(G)-[:default]->(F),
(I)-[:default]->(A);
insert().into(@default).nodes([{_id:"A"}, {_id:"B"}, {_id:"C"}, {_id:"D"}, {_id:"E"}, {_id:"F"}, {_id:"G"}, {_id:"H"}, {_id:"I"}]);
insert().into(@default).edges([{_from:"A", _to:"C"}, {_from:"B", _to:"B"}, {_from:"B", _to:"D"}, {_from:"C", _to:"B"}, {_from:"C", _to:"D"}, {_from:"E", _to:"D"}, {_from:"E", _to:"F"}, {_from:"E", _to:"G"}, {_from:"E", _to:"H"}, {_from:"F", _to:"D"}, {_from:"G", _to:"D"}, {_from:"G", _to:"F"}, {_from:"I", _to:"A"}]);
在HDC图上运行算法
创建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")
参数
算法名:k_core
参数名 |
类型 |
规范 |
默认值 |
可选 |
描述 |
---|---|---|---|---|---|
k |
Integer | ≥1 | / | 否 | k-core子图中每个节点的最小度k |
return_id_uuid |
String | uuid , id , both |
uuid |
是 | 在结果中使用_uuid 、_id 或同时使用两者来表示点;该选项仅在文件回写模式下生效 |
文件回写
CALL algo.k_core.write("my_hdc_graph", {
k: 3,
return_id_uuid: "id"
}, {
file: {
filename: "3-core"
}
})
algo(k_core).params({
projection: "my_hdc_graph",
k: 3,
return_id_uuid: "id"
}).write({
file: {
filename: "3-core"
}
})
结果:
_id
G
F
E
D
完整返回
CALL algo.k_core.run("my_hdc_graph", {
k: 2
}) YIELD k2
RETURN k2
exec{
algo(k_core).params({
k: 2
}) as result
return result
} on my_hdc_graph
[{"id":"G","uuid":"13690943966717935617","schema":"default","values":{}}]
[{"id":"D","uuid":"288231475663339522","schema":"default","values":{}}]
[{"id":"F","uuid":"2882304861028745219","schema":"default","values":{}}]
[{"id":"B","uuid":"3530823207370096641","schema":"default","values":{}}]
[{"id":"E","uuid":"10520409829049106435","schema":"default","values":{}}]
[{"id":"C","uuid":"12033619303845593090","schema":"default","values":{}}]
流式返回
CALL algo.k_core.stream("my_hdc_graph", {
k: 3
}) YIELD r
FOR node in r
RETURN node._id
exec{
algo(k_core).params({
k: 3
}).stream() as r
uncollect r as node
return node._id
} on my_hdc_graph
结果:
node._id |
---|
G |
D |
F |
E |
在分布式投影上运行算法
创建分布式投影
将图集全部投影到shard服务器上并命名为myProj
:
CREATE PROJECTION myProj OPTIONS {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true
}
create().projection("myProj", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true
})
参数
算法名:k_core
参数名 |
类型 |
规范 |
默认值 |
可选 |
描述 |
---|---|---|---|---|---|
k |
Integer | ≥1 | / | 否 | k-Core子图中,每个节点的最小度为k |
文件回写
CALL algo.k_core.write("myProj", {
k: 3
}, {
file: {
filename: "3-core"
}
})
algo(k_core).params({
projection: "myProj",
k: 3
}).write({
file: {
filename: "3-core"
}
})
_id
E
D
F
G