GraphSAGE 节点嵌入训练
GraphSAGE 可以用作一种无监督算法,用于为图中的节点生成嵌入。本页提供了如何使用 GraphSAGE 节点嵌入训练端点的说明。
语法
本节介绍了用于执行 GraphSAGE 节点嵌入训练算法的语法。
CALL graph.gs_unsup_train(
'CPU_X64_XS', (1)
{
['defaultTablePrefix': '...',] (2)
'project': {...}, (3)
'compute': {...}, (4)
}
);
1 | 计算池选择器。 |
2 | 表引用可选前缀。 |
3 | 项目配置。 |
4 | 计算配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
computePoolSelector |
String |
|
否 |
用于运行 GraphSAGE 节点嵌入训练作业的计算池选择器。 |
configuration |
Map |
|
否 |
用于图项目、算法计算和结果回写的配置。 |
对于此算法,强烈建议使用 GPU 计算池,除非数据集非常小且模型较浅。
配置映射包含以下三个条目。
有关以下项目配置的更多详细信息,请参阅项目文档。 |
名称 | 类型 |
---|---|
nodeTables |
节点表列表。 |
relationshipTables |
关系类型到关系表的映射。 |
请注意,为了 GraphSAGE 能够正确传播节点嵌入的更新,每种类型的节点都必须是至少一种关系类型的目标。orientation
参数可用于为仅作为关系源的节点类型添加反向关系(使用“REVERSE”或“UNDIRECTED”方向)。
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
numWalks |
Integer |
|
是 |
对图中每个节点执行的随机游走次数 |
walkDepth |
Integer |
|
是 |
每次随机游走的步数 |
negSamplingRatio |
Float |
|
是 |
用于训练的负样本与正样本的比例 |
modelname |
String |
|
否 |
要训练的模型名称(必须唯一) |
numEpochs |
Integer |
|
否 |
训练模型的 epochs 数量 |
numSamples |
Integer 列表 |
|
否 |
每层采样的邻居数量。请注意,这也会决定层数 |
hiddenChannels |
Integer |
|
是 |
模型层输出的节点嵌入维度 |
activation |
String |
|
是 |
要使用的激活函数。有效值为 "relu" 和 "sigmoid" |
aggregator |
String |
|
是 |
要使用的邻域嵌入聚合器。有效值为 "mean" 和 "max" |
learningRate |
Float |
|
是 |
优化器的学习率 |
dropout |
Float |
|
是 |
每层的 dropout 概率。值必须 >= 0.0 且 < 1.0 |
layerNormalization |
Boolean |
|
是 |
是否在模型层之间应用层归一化 |
epochsPerCheckpoint |
Integer |
|
是 |
保存模型检查点之间的 epochs 数量 |
randomSeed |
Integer |
|
是 |
用于为所有计算随机性设置种子的数字 |
batchSize |
Integer |
|
是 |
每个批次训练的目标节点数量。如果未提供,算法将自动推断在可用内存限制内的最大允许批次大小 |
lossReduction |
String |
|
是 |
应用于损失的归约方法。有效值为 "mean" 和 "sum"。如果未提供,如果提供了显式 |
示例
在我们的示例中,我们将使用一个包含演员、导演、电影和流派的 IMDB 数据集。这些实体都具有与之关联的关键词,我们将把这些关键词用作节点的特征。它们通过关系连接,其中演员出演电影,导演执导电影。
我们有一个名为 imdb
的数据库,其中包含以下表:
-
actor
表,包含nodeid
和plot_keywords
列 -
movie
表,包含nodeid
和plot_keywords
列 -
director
表,包含nodeid
和plot_keywords
列 -
acted_in
表,包含sourcenodeid
和targetnodeid
列,分别表示actor
和movie
节点 ID -
directed_in
表,包含sourcenodeid
和targetnodeid
列,分别表示director
和movie
节点 ID
plot_keywords
列包含与节点关联的关键词,这些关键词被编码为浮点向量。
您可以通过 GitHub 上的说明将此数据集上传到您的 Snowflake 账户:neo4j-product-examples/snowflake-graph-analytics。
训练查询
在以下查询中,我们针对数据集[1]训练了一个用于节点嵌入的 GraphSAGE 模型。
我们训练 10 个 epoch,包含两个隐藏层。
要运行查询,需要为应用程序、您的消费者角色和您的环境进行授权设置。有关此内容的更多信息,请参阅入门页面。
我们还假设应用程序名称默认为 Neo4j_Graph_Analytics。如果您在安装过程中选择了不同的应用程序名称,请将其替换。
CALL Neo4j_Graph_Analytics.graph.gs_unsup_train('GPU_NV_S', {
'defaultTablePrefix': 'imdb.gml',
'project': {
'nodeTables': ['actor', 'director', 'movie'],
'relationshipTables': {
'acted_in': {
'sourceTable': 'actor',
'targetTable': 'movie',
'orientation': 'UNDIRECTED'
},
'directed_in': {
'sourceTable': 'director',
'targetTable': 'movie',
'orientation': 'UNDIRECTED'
}
}
},
'compute': {
'modelname': 'unsup-imdb',
'numEpochs': 10,
'numSamples': [20, 20]
}
});
上述查询应生成一个空作业结果的行。
JOB_ID |
JOB_START |
JOB_END |
JOB_RESULT |
job_c047364f8c3c4dc19f1e06fc3711483f |
2025-04-29 12:39:08.215 |
2025-04-29 12:42:12.820 |
{} |
genre
属性,因为并非所有电影都有流派,此外,使用流派会使嵌入不适合用于预测电影流派。移除流派属性的一种方法是创建一个 movie
表的 Snowflake 视图,并仅选择 nodeid
和 plot_keywords
列。另外,请记住授予应用程序对更新后的电影视图的 SELECT
权限。为简单起见,我们保留名称 movie
并假设它没有 genre
列。