从 Alpha Cypher 聚合迁移到新 Cypher 投影

阅读指南

本指南旨在帮助一直使用 Alpha Cypher 聚合 gds.alpha.graph.project 的用户。现在,Cypher 投影已改用 gds.graph.project 聚合函数实现。我们假设大多数提到的操作和概念无需过多解释即可理解,因此在示例和对比中力求简洁。有关详细信息,请参阅Cypher 投影文档

API 变更

新的 Cypher 投影取代了 Alpha Cypher 聚合。与 Alpha Cypher 聚合一样,新的 Cypher 投影也是作为 Cypher 查询的一部分调用的聚合函数。

API 进行了以下变更:

  • 新的 Cypher 投影使用 gds.graph.project 调用,而非 gds.alpha.graph.project

  • 新的 Cypher 投影定义了一个单一的 map 参数,用于定义投影相关信息(例如标签或属性)。

    • 用于定义图配置的 map 参数依然是独立的。

  • 关系配置 map 中的 properties 键已重命名为 relationshipProperties

  • 增加了额外验证以减少 API 的误用:

    • 验证每个 sourceNode* 条目都有相应的 targetNode* 条目,反之亦然。

    • 如果未遵循上述任何一点,系统会进行识别并协助迁移到此新 API。

表 1. Alpha 聚合与新投影之间的结构性变更
旧版本 新增
$query
RETURN gds.alpha.graph.project(
  $graphName,
  sourceNode,
  targetNode,
  $nodeConfig,
  $relationshipConfig,
  $configuration
)
$relationshipQuery
RETURN gds.graph.project(
  $graphName,
  sourceNode,
  targetNode,
  $dataConfig,
  $configuration
)

示例

以下示例不包含调用聚合函数前的完整 Cypher 查询,也不包含任何返回字段的 YIELD。这两个方面没有变化。

表 2. 并排对比
Alpha 版 (Alpha) 新增

:无任何配置的投影

...
RETURN gds.alpha.graph.project('g', source, target)
...
RETURN gds.graph.project('g', source, target)

:多图投影

...
RETURN gds.alpha.graph.project(
  'g',
  source,
  target,
  {
    sourceNodeLabels: labels(source),
    targetNodeLabels: labels(target),
  }, {
    relationshipType: type(r)
  }
)
...
RETURN gds.graph.project(
  'g',
  source,
  target,
  {
    sourceNodeLabels: labels(source),
    targetNodeLabels: labels(target),
    relationshipType: type(rel)
  }
)

:带有属性的图投影

...
RETURN gds.alpha.graph.project(
  'g',
  source,
  target,
  {
    sourceNodeLabels: labels(source),
    targetNodeLabels: labels(target),
    sourceNodeProperties: source { .age },
    targetNodeProperties: target { .age },
  }, {
    relationshipType: type(rel),
    properties: rel { .numberOfPages }
  }
)
...
RETURN gds.graph.project(
  'g',
  source,
  target,
  {
    sourceNodeLabels: labels(source),
    targetNodeLabels: labels(target),
    sourceNodeProperties: source { .age },
    targetNodeProperties: target { .age },
    relationshipType: type(rel),
    relationshipProperties: rel { .numberOfPages }
  }
)

:带有单侧属性的图投影

...
RETURN gds.alpha.graph.project(
  'g',
  source,
  target,
  {
    sourceNodeLabels: labels(source),
    sourceNodeProperties: source { .age },
  }
)
...
RETURN gds.graph.project(
  'g',
  source,
  target,
  {
    sourceNodeLabels: labels(source),
    targetNodeLabels: NULL,
    sourceNodeProperties: source { .age },
    targetNodeProperties: NULL,
  }
)