三角形计数 (Triangle Count)
简介
三角形计数算法用于计算图中每个节点的三角形数量。三角形是指一组三个节点,其中每个节点都与其他两个节点存在关系。在图论术语中,这有时被称为 3-团 (3-clique)。Neo4j 图分析应用程序中的三角形计数算法仅在无向图中查找三角形。
三角形计数在社交网络分析中日益普及,用于检测社区并衡量这些社区的凝聚力。它还可用于确定图的稳定性,并经常作为网络指标(如聚类系数)计算的一部分。
有关此算法的更多信息,请参阅
-
事实证明,三角形计数和聚类系数可作为将特定网站分类为垃圾邮件或非垃圾邮件内容的有效特征。这一点在 “海量图中局部三角形计数的高效半流算法” (Efficient Semi-streaming Algorithms for Local Triangle Counting in Massive Graphs) 一文中有所描述。
节点标签过滤
对于某些用例,仅计算包含特定节点标签的三角形非常有用。这也可以节省计算时间,因为算法无需考虑不具备指定标签的节点。
该算法支持节点标签过滤,允许您在配置中指定最多三个节点标签的列表。如果指定了三个标签,算法将仅计算包含具有这三个标签的节点的三角形,且每个标签在三角形中必须至少由一个节点表示。如果指定的标签少于三个,算法将计算每个指定标签在三角形中至少由一个节点表示的三角形,但没有指定标签的节点也可以是三角形的一部分。如果列表中重复了某个标签,则该标签将由列表中出现的次数相同的节点数来表示。
语法
本节介绍执行三角形计数算法所使用的语法。
CALL Neo4j_Graph_Analytics.graph.triangle_count(
'CPU_X64_XS', (1)
{
['defaultTablePrefix': '...',] (2)
'project': {...}, (3)
'compute': {...}, (4)
'write': {...} (5)
}
);
| 1 | 计算池选择器。 |
| 2 | 表引用的可选前缀。 |
| 3 | 项目配置。 |
| 4 | 计算配置。 |
| 5 | 写入配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
computePoolSelector |
字符串 |
|
否 |
用于运行三角形计数作业的计算池选择器。 |
配置 |
Map |
|
否 |
用于图项目、算法计算和结果回写的配置。 |
配置映射由以下三个条目组成。
| 有关以下项目配置的更多详细信息,请参阅 项目文档。 |
| 名称 | 类型 |
|---|---|
nodeTables |
节点表列表。 |
relationshipTables |
关系类型到关系表的映射。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
resultProperty |
字符串 |
|
是 |
将回写到 Snowflake 数据库的节点属性。 |
relationshipWeightProperty |
字符串 |
|
是 |
用作权重的关系属性名称。如果未指定,算法将作为无权重运行。 |
maxDegree |
整数 |
|
是 |
在三角形计数中要考虑的节点的最大度数。度数高于此值的节点将被排除,并被赋予 |
labelFilter |
字符串列表 |
|
是 |
一个最多包含三个节点标签的字符串列表。仅计算包含具有每个指定标签代表的节点的三角形。如果留空(默认),将计算所有三角形。 |
| 关于下文写入配置的更多详细信息,请参考 写入文档。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
nodeLabel |
字符串 |
|
否 |
内存中图中用于写入节点属性的节点标签。 |
nodeProperty |
字符串 |
|
是 |
将回写到 Snowflake 数据库的节点属性。 |
outputTable |
字符串 |
|
否 |
Snowflake 数据库中写入节点属性的表。 |
示例
在本节中,我们将展示在具体图上运行三角形计数算法的示例。目的是为了说明结果的样子,并为如何在实际场景中使用该算法提供指导。我们将在一个由少量节点按特定模式连接而成的小型社交网络图上进行演示。示例图如下所示
CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.PERSON (NODEID VARCHAR);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.PERSON VALUES
('Alice'),
('Michael'),
('Karin'),
('Chris'),
('Will'),
('Mark');
CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.KNOWS (SOURCENODEID VARCHAR, TARGETNODEID VARCHAR);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.KNOWS VALUES
('Michael', 'Karin'),
('Michael', 'Chris'),
('Will', 'Michael'),
('Mark', 'Michael'),
('Mark', 'Will'),
('Alice', 'Michael'),
('Will', 'Chris'),
('Chris', 'Karin');
该图通过节点之间的关系形成了多个三角形。例如,Michael、Chris 和 Karin 之间存在一个三角形,因为他们彼此相连。算法将为每个节点计算这些三角形。
在下面的示例中,我们将演示如何在图上使用三角形计数算法。
运行作业
运行三角形计数作业涉及三个步骤:投影 (Project)、计算 (Compute) 和写入 (Write)。
要运行查询,需要为应用程序、您的消费者角色和您的环境设置必要的权限。请参阅 入门 页面以了解更多信息。
我们还假设应用程序名称为默认的 Neo4j_Graph_Analytics。如果您在安装过程中选择了不同的应用程序名称,请将其替换为该名称。
CALL Neo4j_Graph_Analytics.graph.triangle_count('CPU_X64_XS', {
'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
'project': {
'nodeTables': ['PERSON'],
'relationshipTables': {
'KNOWS': {
'sourceTable': 'PERSON',
'targetTable': 'PERSON',
'orientation': 'UNDIRECTED'
}
}
},
'compute': {},
'write': [
{
'nodeLabel': 'PERSON',
'outputTable': 'TRIANGLE_COUNT_BY_PERSON'
}
]
});
| JOB_ID | JOB_STATUS | JOB_START | JOB_END | JOB_RESULT |
|---|---|---|---|---|
job_492026bbeaa6422eb4502a18def04cd6 |
SUCCESS |
2025-04-30 13:53:53.702000 |
2025-04-30 13:54:00.716000 |
{
"project_1": {
"graphName": "snowgraph",
"nodeCount": 6,
"nodeLabels": ...,
"nodeMillis": 218,
"relationshipCount": 16,
"relationshipMillis": 541,
"relationshipTypes": ...,
"totalMillis": 759
},
"triangle_count_1": {
"computeMillis": 15,
"configuration": {
"concurrency": 2,
"maxDegree": 9223372036854775807,
"resultProperty": "triangles",
"nodeLabels": [
"*"
],
"relationshipTypes": [
"*"
]
},
"globalTriangleCount": 3
},
"write_node_property_1": {
"nodeLabel": "PERSON",
"nodeProperty": "triangles",
"outputTable": "EXAMPLE_DB.DATA_SCHEMA.TRIANGLE_COUNT_BY_PERSON",
"rowsWritten": 6,
"writeMillis": 2268
}
} |
返回的结果包含有关作业执行和结果分布的信息。此外,每个节点的三角形计数已写回 Snowflake 数据库。作业结果显示全局三角形计数为 3,代表图中三角形的总数。我们可以查询单个节点的三角形计数,如下所示
SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.TRIANGLE_COUNT_BY_PERSON;
| NODEID | TRIANGLES (三角形) |
|---|---|
Alice |
0 |
Michael |
3 |
Karin |
1 |
Chris |
2 |
Will |
2 |
Mark |
1 |
结果表明,该算法能够识别图中的三角形。这可以在示例图中得到验证。