过滤后的 K-近邻

术语表

有向

有向特征。该算法在有向图上定义良好。

有向

有向特征。该算法忽略图的方向。

有向

有向特征。该算法不能在有向图上运行。

无向

无向特征。该算法在无向图上定义良好。

无向

无向特征。该算法忽略图的无向性。

异构节点

异构节点完全支持。该算法有能力区分不同类型的节点。

异构节点

异构节点允许。该算法平等对待所有选定的节点,无论其标签如何。

异构关系

异构关系完全支持。该算法有能力区分不同类型的关系。

异构关系

异构关系允许。该算法平等对待所有选定的关系,无论其类型如何。

加权关系

加权特征。该算法支持将关系属性用作权重,通过 relationshipWeightProperty 配置参数指定。

加权关系

加权特征。该算法将每个关系视为同等重要,忽略任何关系权重值。

节点属性

节点属性特征。该算法使用节点属性。

简介

过滤后的 K-最近邻 (Filtered K-Nearest Neighbors) 算法扩展了我们广受欢迎的 K-最近邻算法,增加了对源节点、目标节点或两者的过滤功能。

过滤类型

我们处理的是源节点、目标节点以及它们之间包含相似度得分距离的关系。

与 K-最近邻算法一样,过滤后的输出是节点与其 K-最近邻之间的新关系。相似度得分通过关系属性来表示。

此外,过滤后的 K-最近邻算法使您能够控制关系两端的节点,从而无需自行过滤庞大的结果集,并能更好地控制输出量。

源节点过滤

在某些用例中,您需要限制作为源节点的节点集合,或者限制可以作为源节点的节点类型。这就是源节点过滤。您希望获得源自特定节点或特定类型节点的得分最高的关系。

源节点过滤器可以是以下形式之一:

  • 一组节点

  • 一个标签

  • 一组节点一个标签

目标节点过滤

与源节点一样,有时您需要限制作为目标节点的节点集合或节点类型,即目标节点过滤。对于给定的源节点,查找目标节点来自特定集合或特定类型的最高得分关系。

与源节点过滤器一样,目标节点过滤器也可以是以下形式之一:

  • 一组节点

  • 一个标签

  • 一组节点一个标签

目标节点过滤的种子设定 (Seeding)

目标节点过滤的另一个用例是,您必须产生k个结果。您希望用关系填满一个固定大小的存储桶。尽管您希望 K-最近邻算法能找到足够多高分的关系,但作为一种保险策略,我们可以用任意关系来填充您的结果集,以“保证”填满 k 个结果。

正如 K-最近邻算法不能保证找到 k 个结果一样,过滤后的 K-最近邻算法也不严格保证找到 k 个结果。但如果您使用种子设定,将大大增加机会。事实上,使用种子设定时,唯一不会得到 k 个结果的情况是图中不存在 k 个目标节点。

现在,任意填充结果的质量是未知的。这与 similarityCutoff(相似度截止值)参数如何协调?这里我们采用的语义是:种子设定会覆盖相似度截止值。您可能会得到相似度得分低于截止值的结果,但可以保证至少会有 k 个结果。

种子设定是一个布尔属性,您可以开启或关闭(默认为关闭)。

您可以混合搭配源节点过滤、目标节点过滤和种子设定来实现您的目标。

配置过滤器和种子设定

关于标准配置选项,请参考 K-最近邻配置

要使用的源节点过滤器由 sourceNodeFilter 配置参数指定。它不是强制性的。

此参数接受以下之一

表 1. sourceNodeFilter 语法

单个节点 ID

sourceNodeFilter: 42

节点 ID 列表

sourceNodeFilter: [23, 42, 87]

单个节点

MATCH (person:Person) WITH person ORDER BY person.age DESC LIMIT 1 …​ sourceNodeFilter: n

节点列表

MATCH (person:Person) WHERE person.age > 35 collect(person) AS people …​ sourceNodeFilter: people

单个标签

sourceNodeFilter: 'Person'

要使用的目标节点过滤器由 targetNodeFilter 配置参数指定。它不是强制性的。

此参数接受以下之一

表 2. targetNodeFilter 语法

单个节点 ID

targetNodeFilter: 117

节点 ID 列表

targetNodeFilter: [256, 512]

单个节点

MATCH (person:Person) WITH person ORDER BY person.age ASC LIMIT 1 …​ targetNodeFilter: n

节点列表

MATCH (person:Person) WHERE person.age < 35 collect(person) AS people …​ targetNodeFilter: people

单个标签

targetNodeFilter: 'Person'

种子设定可以通过 seedTargetNodes 配置参数启用。它默认为 false

语法

本节涵盖在每种执行模式下执行过滤后 K-最近邻算法的语法。我们描述的是命名图变体语法。要了解更多关于通用语法变体的信息,请参见 语法概述

各模式下的过滤后 K-最近邻语法
在命名图上以流模式运行过滤后 K-最近邻算法。
CALL gds.knn.filtered.stream(
  graphName: String,
  configuration: Map
) YIELD
  node1: Integer,
  node2: Integer,
  similarity: Float
表 3. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

存储在目录中的图的名称。

配置

Map

{}

算法特定配置和/或图过滤配置。

表 4. 配置
名称 类型 默认 可选 描述

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。

concurrency

整数

4 [1]

用于运行算法的并发线程数。

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

nodeProperties

字符串或 Map 或字符串/Map 的列表

不适用

用于计算相似度的节点属性及其选定的相似度度量。接受单个属性键、属性键到度量的映射,或属性键和/或映射的列表,如上所述。详细信息请参阅 节点属性和度量配置

topK

整数

10

为每个节点查找的邻居数量。将返回 K-最近邻居。此值不能低于 1。

sampleRate

浮点数

0.5

限制每个节点比较次数的采样率。值必须介于 0(不含)和 1(含)之间。

deltaThreshold

浮点数

0.001

以百分比表示的值,用于确定何时提前停止。如果发生的更新少于配置的值,算法将停止。值必须介于 0(不含)和 1(含)之间。

maxIterations

整数

100

硬限制,在进行这些迭代后停止算法。

randomJoins

整数

10

对于每次迭代,每个节点根据随机选择连接新节点邻居的随机尝试次数。

initialSampler

字符串

"uniform"

用于为每个节点采样前 k 个随机邻居的方法。“uniform”和“randomWalk”(均不区分大小写)是有效的输入。

randomSeed

整数

不适用

控制算法随机性的种子值。请注意,设置此参数时必须将 concurrency 设置为 1。

similarityCutoff

浮点数

0

从 K-最近邻列表中过滤掉相似度低于此阈值的节点。

perturbationRate

浮点数

0

用相等相似度的已遇到邻居替换已知最不相似邻居的概率。

sourceNodeFilter

整数、整数列表或字符串

不适用

要应用的源节点过滤器。接受单个节点 ID、节点 ID 列表或单个标签。

targetNodeFilter

整数、整数列表或字符串

不适用

要应用的目标节点过滤器。接受单个节点 ID、节点 ID 列表或单个标签。

seedTargetNodes

布尔值

false

启用目标节点种子设定。

1. 在 GDS 会话中,默认值为可用处理器的数量。

表 5. 结果
名称 类型 描述

node1

整数

第一个节点的节点 ID。

node2

整数

第二个节点的节点 ID。

similarity

浮点数

两个节点的相似度分数。

在命名图上以统计模式运行 K-最近邻算法。
CALL gds.knn.filtered.stats(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  nodesCompared: Integer,
  ranIterations: Integer,
  didConverge: Boolean,
  nodePairsConsidered: Integer,
  similarityPairs: Integer,
  similarityDistribution: Map,
  configuration: Map
表 6. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

存储在目录中的图的名称。

配置

Map

{}

算法特定配置和/或图过滤配置。

表 7. 配置
名称 类型 默认 可选 描述

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。

concurrency

整数

4 [2]

用于运行算法的并发线程数。

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

nodeProperties

字符串或 Map 或字符串/Map 的列表

不适用

用于计算相似度的节点属性及其选定的相似度度量。接受单个属性键、属性键到度量的映射,或属性键和/或映射的列表,如上所述。详细信息请参阅 节点属性和度量配置

topK

整数

10

为每个节点查找的邻居数量。将返回 K-最近邻居。此值不能低于 1。

sampleRate

浮点数

0.5

限制每个节点比较次数的采样率。值必须介于 0(不含)和 1(含)之间。

deltaThreshold

浮点数

0.001

以百分比表示的值,用于确定何时提前停止。如果发生的更新少于配置的值,算法将停止。值必须介于 0(不含)和 1(含)之间。

maxIterations

整数

100

硬限制,在进行这些迭代后停止算法。

randomJoins

整数

10

对于每次迭代,每个节点根据随机选择连接新节点邻居的随机尝试次数。

initialSampler

字符串

"uniform"

用于为每个节点采样前 k 个随机邻居的方法。“uniform”和“randomWalk”(均不区分大小写)是有效的输入。

randomSeed

整数

不适用

控制算法随机性的种子值。请注意,设置此参数时必须将 concurrency 设置为 1。

similarityCutoff

浮点数

0

从 K-最近邻列表中过滤掉相似度低于此阈值的节点。

perturbationRate

浮点数

0

用相等相似度的已遇到邻居替换已知最不相似邻居的概率。

sourceNodeFilter

整数、整数列表或字符串

不适用

要应用的源节点过滤器。接受单个节点 ID、节点 ID 列表或单个标签。

targetNodeFilter

整数、整数列表或字符串

不适用

要应用的目标节点过滤器。接受单个节点 ID、节点 ID 列表或单个标签。

seedTargetNodes

布尔值

false

启用目标节点种子设定。

2. 在 GDS 会话中,默认值为可用处理器的数量。

表 8. 结果
名称 类型 描述

ranIterations

整数

运行的迭代次数。

didConverge

布尔值

指示算法是否收敛。

nodePairsConsidered

整数

相似度计算的次数。

preProcessingMillis

整数

预处理数据的毫秒数。

computeMillis

整数

运行算法的毫秒数。

postProcessingMillis

整数

计算相似度值分布统计信息的毫秒数。

nodesCompared

整数

计算过相似度的节点数量。

similarityPairs

整数

结果中的相似度对数量。

similarityDistribution

Map

包含计算出的相似度结果的最小值、最大值、平均值以及 p50, p75, p90, p95, p99 和 p999 百分位值的映射。

配置

Map

用于运行算法的配置。

在目录中存储的图上以变异模式运行 K-最近邻算法。
CALL gds.knn.filtered.mutate(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  mutateMillis: Integer,
  postProcessingMillis: Integer,
  relationshipsWritten: Integer,
  nodesCompared: Integer,
  ranIterations: Integer,
  didConverge: Boolean,
  nodePairsConsidered: Integer,
  similarityDistribution: Map,
  configuration: Map
表 9. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

存储在目录中的图的名称。

配置

Map

{}

算法特定配置和/或图过滤配置。

表 10. 配置
名称 类型 默认 可选 描述

mutateRelationshipType

字符串

不适用

用于写入投影图的新关系的关系类型。

mutateProperty

字符串

不适用

GDS 图中写入相似度分数的属性。

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。

concurrency

整数

4

用于运行算法的并发线程数。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

nodeProperties

字符串或 Map 或字符串/Map 的列表

不适用

用于计算相似度的节点属性及其选定的相似度度量。接受单个属性键、属性键到度量的映射,或属性键和/或映射的列表,如上所述。详细信息请参阅 节点属性和度量配置

topK

整数

10

为每个节点查找的邻居数量。将返回 K-最近邻居。此值不能低于 1。

sampleRate

浮点数

0.5

限制每个节点比较次数的采样率。值必须介于 0(不含)和 1(含)之间。

deltaThreshold

浮点数

0.001

以百分比表示的值,用于确定何时提前停止。如果发生的更新少于配置的值,算法将停止。值必须介于 0(不含)和 1(含)之间。

maxIterations

整数

100

硬限制,在进行这些迭代后停止算法。

randomJoins

整数

10

对于每次迭代,每个节点根据随机选择连接新节点邻居的随机尝试次数。

initialSampler

字符串

"uniform"

用于为每个节点采样前 k 个随机邻居的方法。“uniform”和“randomWalk”(均不区分大小写)是有效的输入。

randomSeed

整数

不适用

控制算法随机性的种子值。请注意,设置此参数时必须将 concurrency 设置为 1。

similarityCutoff

浮点数

0

从 K-最近邻列表中过滤掉相似度低于此阈值的节点。

perturbationRate

浮点数

0

用相等相似度的已遇到邻居替换已知最不相似邻居的概率。

sourceNodeFilter

整数、整数列表或字符串

不适用

要应用的源节点过滤器。接受单个节点 ID、节点 ID 列表或单个标签。

targetNodeFilter

整数、整数列表或字符串

不适用

要应用的目标节点过滤器。接受单个节点 ID、节点 ID 列表或单个标签。

seedTargetNodes

布尔值

false

启用目标节点种子设定。

表 11. 结果
名称 类型 描述

ranIterations

整数

运行的迭代次数。

didConverge

布尔值

指示算法是否收敛。

nodePairsConsidered

整数

相似度计算的次数。

preProcessingMillis

整数

预处理数据的毫秒数。

computeMillis

整数

运行算法的毫秒数。

mutateMillis

整数

向投影图添加属性的毫秒数。

postProcessingMillis

整数

计算相似度值分布统计信息的毫秒数。

nodesCompared

整数

计算过相似度的节点数量。

relationshipsWritten

整数

创建的关系数量。

similarityDistribution

Map

包含计算出的相似度结果的最小值、最大值、平均值、标准差以及 p1, p5, p10, p25, p75, p90, p95, p99, p100 百分位值的映射。

配置

Map

用于运行算法的配置。

在目录中存储的图上以写入模式运行 K-最近邻算法。
CALL gds.knn.filtered.write(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  writeMillis: Integer,
  postProcessingMillis: Integer,
  nodesCompared: Integer,
  ranIterations: Integer,
  didConverge: Boolean,
  nodePairsConsidered: Integer,
  relationshipsWritten: Integer,
  similarityDistribution: Map,
  configuration: Map
表 12. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

存储在目录中的图的名称。

配置

Map

{}

算法特定配置和/或图过滤配置。

表 13. 配置
名称 类型 默认 可选 描述

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。

concurrency

整数

4 [3]

用于运行算法的并发线程数。

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

writeConcurrency

整数

'concurrency' 的值

用于将结果写入 Neo4j 的并发线程数。

writeRelationshipType

字符串

不适用

用于将计算出的关系持久化到 Neo4j 数据库的关系类型。

writeProperty

字符串

不适用

Neo4j 数据库中写入相似度分数的属性。

nodeProperties

字符串或 Map 或字符串/Map 的列表

不适用

用于计算相似度的节点属性及其选定的相似度度量。接受单个属性键、属性键到度量的映射,或属性键和/或映射的列表,如上所述。详细信息请参阅 节点属性和度量配置

topK

整数

10

为每个节点查找的邻居数量。将返回 K-最近邻居。此值不能低于 1。

sampleRate

浮点数

0.5

限制每个节点比较次数的采样率。值必须介于 0(不含)和 1(含)之间。

deltaThreshold

浮点数

0.001

以百分比表示的值,用于确定何时提前停止。如果发生的更新少于配置的值,算法将停止。值必须介于 0(不含)和 1(含)之间。

maxIterations

整数

100

硬限制,在进行这些迭代后停止算法。

randomJoins

整数

10

对于每次迭代,每个节点根据随机选择连接新节点邻居的随机尝试次数。

initialSampler

字符串

"uniform"

用于为每个节点采样前 k 个随机邻居的方法。“uniform”和“randomWalk”(均不区分大小写)是有效的输入。

randomSeed

整数

不适用

控制算法随机性的种子值。请注意,设置此参数时必须将 concurrency 设置为 1。

similarityCutoff

浮点数

0

从 K-最近邻列表中过滤掉相似度低于此阈值的节点。

perturbationRate

浮点数

0

用相等相似度的已遇到邻居替换已知最不相似邻居的概率。

sourceNodeFilter

整数、整数列表或字符串

不适用

要应用的源节点过滤器。接受单个节点 ID、节点 ID 列表或单个标签。

targetNodeFilter

整数、整数列表或字符串

不适用

要应用的目标节点过滤器。接受单个节点 ID、节点 ID 列表或单个标签。

seedTargetNodes

布尔值

false

启用目标节点种子设定。

3. 在 GDS 会话中,默认值为可用处理器的数量。

表 14. 结果
名称 类型 描述

ranIterations

整数

运行的迭代次数。

didConverge

布尔值

指示算法是否收敛。

nodePairsConsidered

整数

相似度计算的次数。

preProcessingMillis

整数

预处理数据的毫秒数。

computeMillis

整数

运行算法的毫秒数。

writeMillis

整数

将结果数据写回 Neo4j 的毫秒数。

postProcessingMillis

整数

计算相似度值分布统计信息的毫秒数。

nodesCompared

整数

计算过相似度的节点数量。

relationshipsWritten

整数

创建的关系数量。

similarityDistribution

Map

包含计算出的相似度结果的最小值、最大值、平均值、标准差以及 p1, p5, p10, p25, p75, p90, p95, p99, p100 百分位值的映射。

配置

Map

用于运行算法的配置。

示例

以下所有示例应在空数据库中运行。

这些示例将 Cypher 投影作为规范。原生投影将在未来版本中弃用。

在本节中,我们将展示在具体图上运行过滤后 K-最近邻算法的示例。

请记住,KNN 可以在仅包含节点的图上运行,无需任何关系。

考虑以下由五个断开连接的 Person 节点组成的图,其中一些人是素食者 (Vegan)。

Visualization of the example graph
CREATE (alice:Person:Vegan {name: 'Alice', age: 24})
CREATE (bob:Person:Vegan {name: 'Bob', age: 73})
CREATE (carol:Person {name: 'Carol', age: 24})
CREATE (dave:Person:Vegan {name: 'Dave', age: 48})
CREATE (eve:Person:Vegan {name: 'Eve', age: 67});

在示例中,我们要使用过滤后 K-最近邻算法根据年龄比较人员。

以下语句将投影图并将其存储在图目录中。
MATCH (p:Person|Vegan)
RETURN gds.graph.project(
  'myGraph',
  p,
  null,
  {
    sourceNodeLabels: labels(p),
    targetNodeLabels: [],
    sourceNodeProperties: p { .age },
    targetNodeProperties: {}
  }
)

内存估算

首先,我们将使用 estimate 过程估算运行该算法的成本。这可以在任何执行模式下完成。在此示例中,我们将使用 stats 模式。估算算法对于理解在图上运行算法对内存的影响非常有用。当您随后在某种执行模式下实际运行算法时,系统将执行一次估算。如果估算结果显示执行超出其内存限制的概率极高,则会禁止执行。要阅读更多关于此的内容,请参见 自动估算和执行阻塞

有关 estimate 的更多详细信息,请参阅 内存估算

以下内容将估算运行算法所需的内存
CALL gds.knn.filtered.stream.estimate('myGraph', {
    topK: 1,
    nodeProperties: ['age'],
    sourceNodeFilter: 'Vegan'
})
YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory
表 15. 结果
nodeCount relationshipCount bytesMin bytesMax requiredMemory

5

0

2256

3312

"[2256 Bytes ... 3312 Bytes]"

过滤源节点

stream 执行模式下,算法返回每个关系的相似度分数。这允许我们直接检查结果或在 Cypher 中进行后处理,而不会产生任何副作用。

有关 stream 模式的更多详细信息,请参阅 流式读取

以下命令将运行算法,过滤源节点,并流式传输结果
CALL gds.knn.filtered.stream('myGraph', {
    topK: 1,
    nodeProperties: ['age'],
    sourceNodeFilter: 'Vegan',
    // The following parameters are set to produce a deterministic result
    randomSeed: 1337,
    concurrency: 1,
    sampleRate: 1.0,
    deltaThreshold: 0.0
})
YIELD node1, node2, similarity
RETURN gds.util.asNode(node1).name AS Person1, gds.util.asNode(node2).name AS Person2, similarity
ORDER BY similarity DESCENDING, Person1, Person2
表 16. 结果
Person1 Person2 similarity

"Alice"

"Carol"

1.0

"Bob"

"Eve"

0.14285714285714285

"Eve"

"Bob"

0.14285714285714285

"Dave"

"Eve"

0.05

我们对大多数过程配置参数使用默认值。设置 randomSeedconcurrency 是为了在每次调用时产生相同的结果。topK 参数设置为 1,以便仅为每个节点返回单个最近邻。请注意,因为 Carol 不是素食者,她没有被包含在结果集中——她被源节点过滤器过滤掉了。

过滤并设定目标节点种子

stream 执行模式下,算法返回每个关系的相似度分数。这允许我们直接检查结果或在 Cypher 中进行后处理,而不会产生任何副作用。

有关 stream 模式的更多详细信息,请参阅 流式读取

以下命令将运行算法,对目标节点集进行种子设定。然后它将过滤目标节点并流式传输结果
CALL gds.knn.filtered.stream('myGraph', {
    topK: 1,
    nodeProperties: ['age'],
    targetNodeFilter: 'Vegan',
    seedTargetNodes: true,
    similarityCutoff: 0.3,
    // The following parameters are set to produce a deterministic result
    randomSeed: 1337,
    concurrency: 1,
    sampleRate: 1.0,
    deltaThreshold: 0.0
})
YIELD node1, node2, similarity
RETURN gds.util.asNode(node1).name AS Person1, gds.util.asNode(node2).name AS Person2, similarity
ORDER BY similarity DESCENDING, Person1, Person2
表 17. 结果
Person1 Person2 similarity

"Carol"

"Alice"

1.0

"Bob"

"Eve"

0.14285714285714285

"Eve"

"Bob"

0.14285714285714285

"Dave"

"Eve"

0.05

"Alice"

"Dave"

0.04

这里我们过滤标签为 Vegan 的目标节点,并设置相似度截止值以确保高质量的结果。通常这意味着结果会更少。但我们也启用了种子设定,当您想保证为每个节点输出 k 个邻居时,就会这样做。在这种情况下,种子设定覆盖了相似度截止值,您可以在输出中看到,每个源节点都有 1 个结果,即使它们的得分相当低。在正常情况下,我们知道 Alice 在年龄相似度上与 Carol 得分非常高。然而,因为 Carol 不是素食者,她没有被包含在结果集中——她被目标节点过滤器过滤掉了——相反,Alice 与 Dave 匹配。

统计

stats 执行模式下,算法返回一行包含算法结果摘要的数据。此执行模式没有任何副作用。通过检查 computeMillis 返回项来评估算法性能非常有用。在下面的示例中,我们将省略返回时间。过程的完整签名可以在 语法部分 中找到。

有关 stats 模式的更多详细信息,请参阅 统计

以下内容将运行算法并以统计和测量值的形式返回结果
CALL gds.knn.filtered.stats('myGraph', {
    topK: 1,
    concurrency: 1,
    randomSeed: 42,
    nodeProperties: ['age'],
    sourceNodeFilter: 'Vegan'
})
YIELD nodesCompared, similarityPairs
表 18. 结果
nodesCompared similarityPairs

5

4

变异 (Mutate)

mutate 执行模式扩展了 stats 模式并产生了一个重要的副作用:使用包含该关系相似度分数的新关系属性更新命名图。新属性的名称使用强制配置参数 mutateProperty 指定。结果是一个摘要行,类似于 stats,但包含一些额外的指标。mutate 模式在同时使用多个算法时特别有用。

有关 mutate 模式的更多详细信息,请参阅 变更

以下内容将运行算法,并将结果写回内存中图
CALL gds.knn.filtered.mutate('myGraph', {
    mutateRelationshipType: 'SIMILAR',
    mutateProperty: 'score',
    topK: 1,
    randomSeed: 42,
    concurrency: 1,
    nodeProperties: ['age'],
    sourceNodeFilter: 'Vegan'
})
YIELD nodesCompared, relationshipsWritten
表 19. 结果
nodesCompared relationshipsWritten

5

4

从结果中可以看出,创建的关系数量等于流式示例中的行数。

变异产生的所有关系都是有向的,即使输入图是无向的。例如,如果 a → ba 的 topK,对称地 b → ab 的 topK,看起来好像产生了一个无向关系。然而,它们只是独立产生的两个有向关系。

写入 (Write)

write 执行模式扩展了 stats 模式,并产生一个重要的副作用:对于每一对节点,我们在 Neo4j 数据库中创建一个关系,并将相似度得分作为属性。新关系的类型由强制配置参数 writeRelationshipType 指定。每个新关系存储它所代表的两个节点之间的相似度得分。关系属性键使用强制配置参数 writeProperty 设置。结果是一行摘要,类似于 stats,但带有一些额外的指标。

有关 write 模式的更多详细信息,请参阅 写入

以下内容将运行算法并写回结果
CALL gds.knn.filtered.write('myGraph', {
    writeRelationshipType: 'SIMILAR',
    writeProperty: 'score',
    topK: 1,
    randomSeed: 42,
    concurrency: 1,
    nodeProperties: ['age'],
    sourceNodeFilter: 'Vegan'
})
YIELD nodesCompared, relationshipsWritten
表 20. 结果
nodesCompared relationshipsWritten

5

4

从结果中可以看出,创建的关系数量等于流式示例中的行数。

写入的关系总是定向的,即使输入图是无向的。例如,如果 a → ba 的 topK,对称地 b → ab 的 topK,看起来好像写入了一个无向关系。然而,它们只是独立写入的两个有向关系。