概述
三角形计算(Triangle Counting)算法能识别图中的三角形,三角形表示一组相互连接的三个节点。三角形计算能够体现图中任意三个点之间形成环路的能力。
社交网络中的三角形表示存在有凝聚力的社区,识别三角形有助于理解网络中个人或群体的聚类和相互联系。在金融网络或交易网络中,三角形的存在可能表示存在可疑或欺诈活动,三角形计数可以帮助识别可能需要进一步调查的交易模式。
基本概念
三角形
在复杂图中,任意两点之间可以有多条边,这导致三个节点可能形成超过一个三角形。以下图为例:
- 计算按边组装的不同三角形,有4个。
- 计算按点组装的不同三角形,有2个。

在复杂图中,按边组装的三角形数量往往大于按点组装的三角形数量。组装原则应根据分析目标和应用场景而定。在社交网络分析中,重点通常是理解个体之间的连接模式,因此通常采用按点组装的原则。在金融网络分析或其他类似的领域,重点往往是节点之间的关系,例如金融交易或交互,按边组装原则通常是首选,因为这样可以检查节点连接的紧密程度以及资金或信息如何流经网络。
特殊说明
- 三角形计算算法忽略边的方向,按照无向边进行计算。
示例图集

创建示例图集:
// 在空图集中逐行运行以下语句
create().node_property(@default, "amount", int32)
insert().into(@default).nodes([{_id:"C1", amount: 1}, {_id:"C2", amount: 6}, {_id:"C3", amount: 2}, {_id:"C4", amount: 5}, {_id:"C5", amount: 5}, {_id:"C6", amount: 2}])
insert().into(@default).edges([{_from:"C4", _to:"C1"}, {_from:"C4", _to:"C1"}, {_from:"C4", _to:"C2"}, {_from:"C1", _to:"C2"}, {_from:"C2", _to:"C3"}, {_from:"C1", _to:"C3"}, {_from:"C3", _to:"C5"}, {_from:"C3", _to:"C6"}])
在HDC图集上运行算法
创建HDC图集
将当前图集全部加载到HDC服务器hdc-server-1
上,并命名为 hdc_tri_cnt
:
CALL hdc.graph.create("hdc-server-1", "hdc_tri_cnt", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
})
hdc.graph.create("hdc_tri_cnt", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
}).to("hdc-server-1")
参数
算法名:triangle_counting
参数名 |
类型 |
规范 |
默认值 |
可选 |
描述 |
---|---|---|---|---|---|
type |
Integer | 1 , 2 |
1 |
是 | 设置为1 时,按边组装三角形;为2 时,按点组装三角形 |
result_type |
Integer | 1 , 2 |
1 |
是 | 设置为1 时,返回三角形数量;为2 时,返回每个三角形中的点或边 |
return_id_uuid |
String | uuid , id , both |
uuid |
是 | 在结果中使用_uuid 、_id 或同时使用两者来表示点。只能使用_uuid 来表示边 |
limit |
Integer | ≥-1 | -1 |
是 | 限制返回的结果数;-1 返回所有结果 |
文件回写
CALL algo.triangle_counting.write("hdc_tri_cnt", {
params: {
type: 1,
result_type: 2
},
return_params: {
file: {
filename: "byEdges.txt"
}
}
})
algo(triangle_counting).params({
projection: "hdc_tri_cnt",
type: 1,
result_type: 2
}).write({
file: {
filename: "byEdges.txt"
}
})
结果:
_edge_uuids
1,3,4
2,3,4
6,5,4
CALL algo.triangle_counting.write("hdc_tri_cnt", {
params: {
return_id_uuid: "id",
type: 2,
result_type: 2
},
return_params: {
file: {
filename: "byNodes.txt"
}
}
})
algo(triangle_counting).params({
projection: "hdc_tri_cnt",
return_id_uuid: "id",
type: 2,
result_type: 2
}).write({
file: {
filename: "byNodes.txt"
}
})
结果:
_node_ids
C1,C4,C2
C1,C3,C2
统计回写
CALL algo.triangle_counting.write("hdc_tri_cnt", {
params: {},
return_params: {
stats: {}
}
})
algo(triangle_counting).params({
projection: "hdc_tri_cnt"
}).write({
stats: {}
})
结果:
triangle_count |
---|
3 |
完整返回
CALL algo.triangle_counting("hdc_tri_cnt", {
params: {
result_type: 1
},
return_params: {}
}) YIELD result
RETURN result
exec{
algo(triangle_counting).params({
result_type: 1
}) as result
return result
} on hdc_tri_cnt
结果:
triangle_count |
---|
3 |
流式返回
CALL algo.triangle_counting("hdc_tri_cnt", {
params: {
return_id_uuid: "id",
type: 2,
result_type: 2
},
return_params: {
stream: {}
}
}) YIELD r
RETURN r
exec{
algo(triangle_counting).params({
return_id_uuid: "id",
type: 2,
result_type: 2
}).stream() as r
return r
} on hdc_tri_cnt
结果:
_ids |
---|
["C1","C4","C2"] |
["C1","C3","C2"] |
统计返回
CALL algo.triangle_counting("hdc_tri_cnt", {
params: {
result_type: 1
},
return_params: {
stats: {}
}
}) YIELD stats
RETURN stats
exec{
algo(triangle_counting).params({
result_type: 1
}).stats() as stats
return stats
} on hdc_tri_cnt
结果:
triangle_count |
---|
3 |
在分布式投影上运行算法
创建分布式投影
将图集全部投影到shard服务器上并命名为dist_tri_cnt
:
create().projection("dist_tri_cnt", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true
})
参数
算法名:triangle_counting
参数名 |
类型 |
规范 |
默认值 |
可选 |
描述 |
---|---|---|---|---|---|
result_type |
Integer | 1 , 2 |
1 |
是 | 设置为1 时,返回三角形数量;为2 时,返回每个三角形中的点或边 |
limit |
Integer | ≥-1 | -1 |
是 | 限制返回的结果数;-1 返回所有结果 |
该算法的分布式版本仅按点组装三角形。
文件回写
CALL algo.triangle_counting.write("dist_tri_cnt", {
params: {
result_type: 1
},
return_params: {
file: {
filename: "triCnt"
}
}
})
algo(triangle_counting).params({
projection: "dist_tri_cnt",
result_type: 1
}).write({
file: {
filename: "triCnt"
}
})
triangle
2
CALL algo.triangle_counting.write("dist_tri_cnt", {
params: {
result_type: 2
},
return_params: {
file: {
filename: "triNodes"
}
}
})
algo(triangle_counting).params({
projection: "dist_tri_cnt",
result_type: 2
}).write({
file: {
filename: "triNodes"
}
})
triangle
216173881625411585,3386708019294240770,13330655996528295937
216173881625411585,10088064264821538817,13330655996528295937
结果中使用点的
_uuid
值。