GraphSAGE 节点嵌入训练

GraphSAGE 可以用作一种无监督算法,用于为图中的节点生成嵌入。本页提供了如何使用 GraphSAGE 节点嵌入训练端点的说明。

语法

本节介绍了用于执行 GraphSAGE 节点嵌入训练算法的语法。

运行 GraphSAGE 节点嵌入训练。
CALL graph.gs_unsup_train(
  'CPU_X64_XS',                    (1)
  {
    ['defaultTablePrefix': '...',] (2)
    'project': {...},              (3)
    'compute': {...},              (4)
  }
);
1 计算池选择器。
2 表引用可选前缀。
3 项目配置。
4 计算配置。
表 1. 参数
名称 类型 默认值 可选 描述

computePoolSelector

String

不适用

用于运行 GraphSAGE 节点嵌入训练作业的计算池选择器。

configuration

Map

{}

用于图项目、算法计算和结果回写的配置。

对于此算法,强烈建议使用 GPU 计算池,除非数据集非常小且模型较浅。

配置映射包含以下三个条目。

有关以下项目配置的更多详细信息,请参阅项目文档
表 2. 项目配置
名称 类型

nodeTables

节点表列表。

relationshipTables

关系类型到关系表的映射。

请注意,为了 GraphSAGE 能够正确传播节点嵌入的更新,每种类型的节点都必须是至少一种关系类型的目标。orientation 参数可用于为仅作为关系源的节点类型添加反向关系(使用“REVERSE”或“UNDIRECTED”方向)。

表 3. 计算配置
名称 类型 默认值 可选 描述

numWalks

Integer

10

对图中每个节点执行的随机游走次数

walkDepth

Integer

3

每次随机游走的步数

negSamplingRatio

Float

1.0

用于训练的负样本与正样本的比例

modelname

String

不适用

要训练的模型名称(必须唯一)

numEpochs

Integer

不适用

训练模型的 epochs 数量

numSamples

Integer 列表

不适用

每层采样的邻居数量。请注意,这也会决定层数

hiddenChannels

Integer

256

模型层输出的节点嵌入维度

activation

String

"relu"

要使用的激活函数。有效值为 "relu" 和 "sigmoid"

aggregator

String

"mean"

要使用的邻域嵌入聚合器。有效值为 "mean" 和 "max"

learningRate

Float

0.001

优化器的学习率

dropout

Float

0.1

每层的 dropout 概率。值必须 >= 0.0 且 < 1.0

layerNormalization

Boolean

true

是否在模型层之间应用层归一化

epochsPerCheckpoint

Integer

max(numEpochs / 10, 1)

保存模型检查点之间的 epochs 数量

randomSeed

Integer

一个随机整数

用于为所有计算随机性设置种子的数字

batchSize

Integer

自动推断

每个批次训练的目标节点数量。如果未提供,算法将自动推断在可用内存限制内的最大允许批次大小

lossReduction

String

自动推断

应用于损失的归约方法。有效值为 "mean" 和 "sum"。如果未提供,如果提供了显式 batchSize,则归约方法将为 "mean",否则为 "sum"

示例

在我们的示例中,我们将使用一个包含演员、导演、电影和流派的 IMDB 数据集。这些实体都具有与之关联的关键词,我们将把这些关键词用作节点的特征。它们通过关系连接,其中演员出演电影,导演执导电影。

我们有一个名为 imdb 的数据库,其中包含以下表:

  • actor 表,包含 nodeidplot_keywords

  • movie 表,包含 nodeidplot_keywords

  • director 表,包含 nodeidplot_keywords

  • acted_in 表,包含 sourcenodeidtargetnodeid 列,分别表示 actormovie 节点 ID

  • directed_in 表,包含 sourcenodeidtargetnodeid 列,分别表示 directormovie 节点 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

{}


1. 在计算嵌入时,我们不希望使用 Movies 的 genre 属性,因为并非所有电影都有流派,此外,使用流派会使嵌入不适合用于预测电影流派。移除流派属性的一种方法是创建一个 movie 表的 Snowflake 视图,并仅选择 nodeidplot_keywords 列。另外,请记住授予应用程序对更新后的电影视图的 SELECT 权限。为简单起见,我们保留名称 movie 并假设它没有 genre 列。
© . All rights reserved.