GraphSAGE 节点分类预测

要应用 GraphSAGE 节点分类预测,必须首先使用 GraphSAGE 节点分类训练 端点训练好一个 GraphSAGE 节点分类模型。

本页面提供了如何使用 GraphSAGE 节点分类预测端点来预测新节点类标签的说明。

预测会针对目标标签的所有节点生成结果,包括在训练期间目标属性值为 null 的节点。这使得基于部分标记的图进行训练并获得未标记节点的预测成为可能。

语法

本节介绍了执行 GraphSAGE 节点分类预测算法所使用的语法。

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

computePoolSelector

字符串

不适用

用于运行 GraphSAGE 节点分类预测作业的计算池选择器。

配置

Map

{}

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

对于此算法,如果输入图较大或模型较深,我们建议使用 GPU 计算池;但在其他情况下,使用 CPU 计算池或许也能满足需求。

配置映射由以下三个条目组成。

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

nodeTables

节点表列表。

relationshipTables

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

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

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

modelname

字符串

不适用

要使用的已训练模型的名称

batchSize

整数

继承

每个批次中要进行预测的目标节点数量。如果未提供,将使用训练模型时所用的评估批次大小。

randomSeed

整数

随机整数

用于初始化计算中所有随机性的数字

有关下方写入(Write)配置的更多详细信息,请参阅 写入文档
表 4. 写入配置
名称 类型 默认 可选 描述

nodeLabel

字符串

不适用

内存中图中用于写入节点属性的节点标签。

outputTable

字符串

不适用

Snowflake 数据库中写入节点属性的表。

示例

在我们的示例中,我们将使用一个包含演员、导演、电影和流派的 IMDB 数据集。这些节点都关联有关键字,我们将用其作为节点的特征。它们通过关系连接:演员出演电影,导演执导电影。目标是预测电影的流派。

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

  • actor,具有 nodeidplot_keywords

  • movie,具有 nodeidplot_keywordsgenre

  • director,具有 nodeidplot_keywords

  • acted_in,具有 sourcenodeidtargetnodeid 列,代表 actormovie 节点的 ID

  • directed_in,具有 sourcenodeidtargetnodeid 列,代表 directormovie 节点的 ID

plot_keywords 列包含与节点关联的关键字,编码为浮点数向量。genre 列包含电影节点的目标类标签,这是我们想要预测的内容。

您可以按照 GitHub 上的说明将此数据集上传到您的 Snowflake 账户:neo4j-product-examples/snowflake-graph-analytics

预测查询

我们假设已使用 GraphSAGE 节点分类训练 端点训练了一个名为 nc-imdb 的模型(请参阅示例)。

在接下来的预测查询中,我们像训练时一样指定项目配置。我们只需要在 compute 配置中指定 modelname,其余配置将从训练配置中继承。

另请注意,我们提供了 write 配置来指定存储计算出的预测结果的表。

要运行查询,需要为应用程序、消费者角色和环境进行必要的权限授予设置。请参阅 入门 页面以了解更多信息。

我们还假设应用程序名称为默认的 Neo4j_Graph_Analytics。如果您在安装过程中选择了不同的应用程序名称,请将其替换为该名称。

CALL Neo4j_Graph_Analytics.graph.gs_nc_predict('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': 'nc-imdb'
    },
    'write': [{
        'nodeLabel': 'movie',
        'outputTable': 'genre_predictions'
    }]
});

上述查询应产生类似于以下的结果。

JOB_ID JOB_STATUS JOB_START JOB_END JOB_RESULT

job_c30b2eb7604f4fd49e805469b910d54b

SUCCESS

2025-11-28T14:29:38.861504

2025-11-28T14:30:06.967113

{
  "gs_nc_predict": {
    "predictMillis": 14959
  },
  "project": {
    "graphName": "snowgraph",
    "nodeCount": 12772,
    "nodeLabels": {
      "ACTOR": {
        "count": 5841,
        "nodeId": {
          "dataType": "int16"
        },
        "properties": {
          "plot_keywords": {
            "dataType": "ndarray[float32]",
            "dimension": 1256
          }
        },
        "table": "IMDB.GML.ACTOR"
      },
      "DIRECTOR": {
        "count": 2270,
        "nodeId": {
          "dataType": "int16"
        },
        "properties": {
          "plot_keywords": {
            "dataType": "ndarray[float32]",
            "dimension": 1256
          }
        },
        "table": "IMDB.GML.DIRECTOR"
      },
      "MOVIE": {
        "count": 4661,
        "nodeId": {
          "dataType": "int16"
        },
        "properties": {
          "genre": {
            "dataType": "float64",
            "dimension": 1
          },
          "plot_keywords": {
            "dataType": "ndarray[float32]",
            "dimension": 1256
          }
        },
        "table": "IMDB.GML.MOVIE"
      }
    },
    "nodeMillis": 1520,
    "relationshipCount": 18644,
    "relationshipMillis": 177,
    "relationshipTypes": {
      "ACTED_IN": {
        "count": 13983,
        "direction": "UNDIRECTED",
        "sourceTable": "IMDB.GML.ACTOR",
        "table": "IMDB.GML.ACTED_IN",
        "targetTable": "IMDB.GML.MOVIE"
      },
      "DIRECTED_IN": {
        "count": 4661,
        "direction": "UNDIRECTED",
        "sourceTable": "IMDB.GML.DIRECTOR",
        "table": "IMDB.GML.DIRECTED_IN",
        "targetTable": "IMDB.GML.MOVIE"
      }
    },
    "totalMillis": 1697
  },
  "write_node_property_0": {
    "nodeLabel": "MOVIE",
    "outputTable": "IMDB.GML.GENRE_PREDICTIONS",
    "rowsWritten": 4661,
    "writeMillis": 2195
  }
}

我们可以通过运行以下命令来检查前 10 个节点的预测结果和概率:

SELECT * FROM IMDB.GML.genre_predictions LIMIT 10;

执行结果为:

NODEID	PREDICTED_CLASS	       PREDICTED_PROBABILITIES
  4467	              2	  [0.006307,0.028976,0.964717]
  4571	              2   [0.003825,0.039170,0.957005]
  3865	              2   [0.006841,0.058649,0.934510]
  2382	              2   [0.007916,0.048241,0.943842]
  2071	              2   [0.007994,0.015378,0.976628]
  3239	              1   [0.019813,0.941223,0.038963]
  2975	              1   [0.006499,0.946676,0.046826]
  4075	              1   [0.004404,0.948304,0.047292]
  2765	              2   [0.024119,0.007341,0.968539]
    29                0	  [0.915931,0.006881,0.077187]