过滤节点相似性

词汇表

有向

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

有向

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

有向

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

无向

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

无向

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

异构节点

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

异构节点

异构节点 允许。该算法对所有选定的节点进行类似处理,而不管其标签如何。

异构关系

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

异构关系

异构关系 允许。该算法对所有选定的关系进行类似处理,而不管其类型如何。

加权关系

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

加权关系

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

简介

过滤节点相似性算法是对 节点相似性 算法的扩展。它增加了对源节点、目标节点或两者的过滤支持。

节点过滤

节点过滤器减少了算法将生成结果的节点空间。考虑两个相似性结果:A = (alice)-[:SIMILAR_TO]→(bob)B (bob)-[:SIMILAR_TO]→(alice)。如果(alice)节点匹配源节点过滤器,并且(bob)节点匹配目标节点过滤器,则会生成结果 A。如果(alice)节点不匹配目标节点过滤器,或者(bob)节点不匹配源节点过滤器,则不会生成结果B

配置节点过滤器

对于节点相似性的标准配置,请参阅 节点相似性语法

源节点过滤器通过 `sourceNodeFilter` 配置参数指定。目标节点过滤器通过 `targetNodeFilter` 配置参数指定。这两个参数都不是必须的。

节点过滤器参数可以接受以下其中一项:

表 1. `sourceNodeFilter` 和 `targetNodeFilter` 的语法

单个节点 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'

语法

本节介绍在每种执行模式下执行过滤节点相似性算法使用的语法。我们正在描述命名的图语法变体。要了解有关通用语法变体的更多信息,请参阅 语法概述

每种模式下的过滤节点相似性语法
在命名图上以流模式运行过滤节点相似性算法。
CALL gds.nodeSimilarity.filtered.stream(
  graphName: String,
  configuration: Map
) YIELD
  node1: Integer,
  node2: Integer,
  similarity: Float
表 2. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

similarityCutoff

浮点数

1e-42

结果中存在的相似度分数的下限。值必须介于 0 和 1 之间。

degreeCutoff

整数

1

节点度数的包含下限,节点才能在比较中被考虑。此值不能低于 1。

upperDegreeCutoff

整数

2147483647

节点度数的包含上限,节点才能在比较中被考虑。此值不能低于 1。

topK

整数

10

每个节点分数的限制。返回 K 个最大的结果。此值不能低于 1。

bottomK

整数

10

每个节点分数的限制。返回 K 个最小的结果。此值不能低于 1。

topN

整数

0

计算的分数的全局限制。返回 N 个最大的总结果。此值不能为负,值为 0 表示没有全局限制。

bottomN

整数

0

计算的分数的全局限制。返回 N 个最小的总结果。此值不能为负,值为 0 表示没有全局限制。

relationshipWeightProperty

字符串

null

用作权重的关系属性的名称。如果未指定,则算法将运行无权重。

similarityMetric

字符串

JACCARD

用于计算相似度的度量。可以是 `JACCARD`、`OVERLAP` 或 `COSINE`。

useComponents

布尔值或字符串

false

如果启用,节点相似性将使用组件来提高计算性能,跳过不同组件中节点的比较。设置为 `false`(默认):算法不使用组件,而是计算整个图的相似性。设置为 `true`:算法使用组件,并在计算相似性之前计算这些组件。设置为**字符串**:使用存储在图中的预计算组件,**字符串**是表示组件的节点属性的键。

sourceNodeFilter

整数或整数列表或字符串

n/a

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

targetNodeFilter

整数或整数列表或字符串

n/a

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

表 4. 结果
名称 类型 描述

node1

整数

第一个节点的节点 ID。

node2

整数

第二个节点的节点 ID。

similarity

浮点数

这两个节点的相似度分数。

在命名图上以统计模式运行节点相似性算法。
CALL gds.nodeSimilarity.filtered.stats(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  nodesCompared: Integer,
  similarityPairs: Integer,
  similarityDistribution: Map,
  configuration: Map
表 5. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

similarityCutoff

浮点数

1e-42

结果中存在的相似度分数的下限。值必须介于 0 和 1 之间。

degreeCutoff

整数

1

节点度数的包含下限,节点才能在比较中被考虑。此值不能低于 1。

upperDegreeCutoff

整数

2147483647

节点度数的包含上限,节点才能在比较中被考虑。此值不能低于 1。

topK

整数

10

每个节点分数的限制。返回 K 个最大的结果。此值不能低于 1。

bottomK

整数

10

每个节点分数的限制。返回 K 个最小的结果。此值不能低于 1。

topN

整数

0

计算的分数的全局限制。返回 N 个最大的总结果。此值不能为负,值为 0 表示没有全局限制。

bottomN

整数

0

计算的分数的全局限制。返回 N 个最小的总结果。此值不能为负,值为 0 表示没有全局限制。

relationshipWeightProperty

字符串

null

用作权重的关系属性的名称。如果未指定,则算法将运行无权重。

similarityMetric

字符串

JACCARD

用于计算相似度的度量。可以是 `JACCARD`、`OVERLAP` 或 `COSINE`。

useComponents

布尔值或字符串

false

如果启用,节点相似性将使用组件来提高计算性能,跳过不同组件中节点的比较。设置为 `false`(默认):算法不使用组件,而是计算整个图的相似性。设置为 `true`:算法使用组件,并在计算相似性之前计算这些组件。设置为**字符串**:使用存储在图中的预计算组件,**字符串**是表示组件的节点属性的键。

sourceNodeFilter

整数或整数列表或字符串

n/a

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

targetNodeFilter

整数或整数列表或字符串

n/a

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

表 7. 结果
名称 类型 描述

preProcessingMillis

整数

预处理数据的毫秒数。

computeMillis

整数

运行算法的毫秒数。

postProcessingMillis

整数

计算组件计数和分布统计信息的毫秒数。

nodesCompared

整数

计算相似度的节点数。

similarityPairs

整数

结果中的相似度数。

similarityDistribution

映射

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

configuration

映射

用于运行算法的配置。

在命名图上以变异模式运行过滤节点相似性算法。
CALL gds.nodeSimilarity.filtered.mutate(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  mutateMillis: Integer,
  postProcessingMillis: Integer,
  relationshipsWritten: Integer,
  nodesCompared: Integer,
  similarityDistribution: Map,
  configuration: Map
表 8. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

configuration

映射

{}

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

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

mutateRelationshipType

字符串

n/a

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

mutateProperty

字符串

n/a

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

内部生成

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

similarityCutoff

浮点数

1e-42

结果中存在的相似度分数的下限。值必须介于 0 和 1 之间。

degreeCutoff

整数

1

节点度数的包含下限,节点才能在比较中被考虑。此值不能低于 1。

upperDegreeCutoff

整数

2147483647

节点度数的包含上限,节点才能在比较中被考虑。此值不能低于 1。

topK

整数

10

每个节点分数的限制。返回 K 个最大的结果。此值不能低于 1。

bottomK

整数

10

每个节点分数的限制。返回 K 个最小的结果。此值不能低于 1。

topN

整数

0

计算的分数的全局限制。返回 N 个最大的总结果。此值不能为负,值为 0 表示没有全局限制。

bottomN

整数

0

计算的分数的全局限制。返回 N 个最小的总结果。此值不能为负,值为 0 表示没有全局限制。

relationshipWeightProperty

字符串

null

用作权重的关系属性的名称。如果未指定,则算法将运行无权重。

similarityMetric

字符串

JACCARD

用于计算相似度的度量。可以是 `JACCARD`、`OVERLAP` 或 `COSINE`。

useComponents

布尔值或字符串

false

如果启用,节点相似性将使用组件来提高计算性能,跳过不同组件中节点的比较。设置为 `false`(默认):算法不使用组件,而是计算整个图的相似性。设置为 `true`:算法使用组件,并在计算相似性之前计算这些组件。设置为**字符串**:使用存储在图中的预计算组件,**字符串**是表示组件的节点属性的键。

sourceNodeFilter

整数或整数列表或字符串

n/a

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

targetNodeFilter

整数或整数列表或字符串

n/a

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

表 10. 结果
名称 类型 描述

preProcessingMillis

整数

预处理数据的毫秒数。

computeMillis

整数

运行算法的毫秒数。

mutateMillis

整数

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

postProcessingMillis

整数

计算百分位数的毫秒数。

nodesCompared

整数

计算相似度的节点数。

relationshipsWritten

整数

创建的关系数。

similarityDistribution

映射

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

configuration

映射

用于运行算法的配置。

在命名图上以写入模式运行过滤节点相似性算法。
CALL gds.nodeSimilarity.filtered.write(
  graphName: String,
  configuration: Map
)
YIELD
 preProcessingMillis: Integer,
  computeMillis: Integer,
  writeMillis: Integer,
  postProcessingMillis: Integer,
  nodesCompared: Integer,
  relationshipsWritten: Integer,
  similarityDistribution: Map,
  configuration: Map
表 11. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

writeConcurrency

整数

'concurrency' 的值

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

writeRelationshipType

字符串

n/a

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

writeProperty

字符串

n/a

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

similarityCutoff

浮点数

1e-42

结果中存在的相似度分数的下限。值必须介于 0 和 1 之间。

degreeCutoff

整数

1

节点度数的包含下限,节点才能在比较中被考虑。此值不能低于 1。

upperDegreeCutoff

整数

2147483647

节点度数的包含上限,节点才能在比较中被考虑。此值不能低于 1。

topK

整数

10

每个节点分数的限制。返回 K 个最大的结果。此值不能低于 1。

bottomK

整数

10

每个节点分数的限制。返回 K 个最小的结果。此值不能低于 1。

topN

整数

0

计算的分数的全局限制。返回 N 个最大的总结果。此值不能为负,值为 0 表示没有全局限制。

bottomN

整数

0

计算的分数的全局限制。返回 N 个最小的总结果。此值不能为负,值为 0 表示没有全局限制。

relationshipWeightProperty

字符串

null

用作权重的关系属性的名称。如果未指定,则算法将运行无权重。

similarityMetric

字符串

JACCARD

用于计算相似度的度量。可以是 `JACCARD`、`OVERLAP` 或 `COSINE`。

useComponents

布尔值或字符串

false

如果启用,节点相似性将使用组件来提高计算性能,跳过不同组件中节点的比较。设置为 `false`(默认):算法不使用组件,而是计算整个图的相似性。设置为 `true`:算法使用组件,并在计算相似性之前计算这些组件。设置为**字符串**:使用存储在图中的预计算组件,**字符串**是表示组件的节点属性的键。

sourceNodeFilter

整数或整数列表或字符串

n/a

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

targetNodeFilter

整数或整数列表或字符串

n/a

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

表 13. 结果
名称 类型 描述

preProcessingMillis

整数

预处理数据的毫秒数。

computeMillis

整数

运行算法的毫秒数。

writeMillis

整数

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

postProcessingMillis

整数

计算百分位数的毫秒数。

nodesCompared

整数

计算相似度的节点数。

relationshipsWritten

整数

创建的关系数。

similarityDistribution

映射

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

configuration

映射

用于运行算法的配置。

示例

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

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

在本节中,我们将展示在具体图上运行过滤节点相似性算法的示例。目的是说明结果是什么样子,并提供有关如何在实际环境中使用该算法的指南。我们将在少量节点以特定模式连接的小型知识图上进行此操作。示例图如下所示

Visualization of the example graph
以下 Cypher 语句将在 Neo4j 数据库中创建示例图
CREATE
  (alice:Person:Singer {name: 'Alice'}),
  (bob:Person:Singer {name: 'Bob'}),
  (carol:Person:Singer {name: 'Carol'}),
  (dave:Person {name: 'Dave'}),
  (eve:Person:Singer {name: 'Eve'}),
  (guitar:Instrument {name: 'Guitar'}),
  (synth:Instrument {name: 'Synthesizer'}),
  (bongos:Instrument {name: 'Bongos'}),
  (trumpet:Instrument {name: 'Trumpet'}),

  (alice)-[:LIKES]->(guitar),
  (alice)-[:LIKES]->(synth),
  (alice)-[:LIKES {strength: 0.5}]->(bongos),
  (bob)-[:LIKES]->(guitar),
  (bob)-[:LIKES]->(synth),
  (carol)-[:LIKES]->(bongos),
  (dave)-[:LIKES]->(guitar),
  (dave)-[:LIKES]->(synth),
  (dave)-[:LIKES]->(bongos);

此二部图有两个节点集,Person 节点和 Instrument 节点。一些 Person 节点也是歌手。这两个节点集通过 LIKES 关系连接。每个关系都从 Person 节点开始,到 Instrument 节点结束。

过滤节点相似性算法仅计算度数至少为 1 的节点的相似性。因此,Eve 将不会包含在结果中,因为她的度数为零。

以下语句将投影图并将其存储在图目录中。
MATCH (source)
OPTIONAL MATCH (source:Person|Singer)-[r:LIKES]->(target:Instrument)
RETURN gds.graph.project(
  'myGraph',
  source,
  target,
  {
    sourceNodeLabels: labels(source),
    targetNodeLabels: labels(target),
    relationshipProperties: r { strength: coalesce(r.strength, 1.0) }
  }
)

在以下示例中,我们将演示在此图上使用过滤节点相似性算法。特别是,我们将应用 `sourceNodeFilter` 和 `targetNodeFilter` 过滤器,将我们的相似性搜索严格限制在也具有 Singer 标签的 Person 节点。

内存估算

首先,我们将使用 `estimate` 过程估算运行算法的成本。这可以在任何执行模式下完成。在本例中,我们将使用 `write` 模式。估算算法有助于了解在图上运行算法将产生的内存影响。当您稍后在其中一种执行模式下实际运行算法时,系统将执行估算。如果估算表明执行很有可能超过其内存限制,则会禁止执行。要了解有关此内容的更多信息,请参阅 自动估算和执行阻止

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

以下将估算运行算法所需的内存:
CALL gds.nodeSimilarity.filtered.write.estimate('myGraph', {
    writeRelationshipType: 'SIMILAR',
    writeProperty: 'score',
    sourceNodeFilter:'Singer',
    targetNodeFilter:'Singer'
})
YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory
表 14. 结果
nodeCount relationshipCount bytesMin bytesMax requiredMemory

9

9

2384

2600

"[2384 字节 ... 2600 字节]"

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

有关 `stream` 模式的一般详细信息,请参阅

以下将运行算法并流式传输结果:
CALL gds.nodeSimilarity.filtered.stream('myGraph', {sourceNodeFilter:'Singer' , targetNodeFilter:'Singer' } )
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
表 15. 结果
Person1 Person2 similarity

"Alice"

"Bob"

0.6666666666666666

"Bob"

"Alice"

0.6666666666666666

"Alice"

"Carol"

0.3333333333333333

"Carol"

"Alice"

0.3333333333333333

统计

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

有关 `stats` 模式的一般详细信息,请参阅 统计

以下将使用指定的过滤器运行节点相似性算法,并以统计和测量值的表单返回结果:
CALL gds.nodeSimilarity.filtered.stats('myGraph', {sourceNodeFilter:'Singer' , targetNodeFilter:'Singer' } )
YIELD nodesCompared, similarityPairs
表 16. 结果

nodesCompared similarityPairs

3

4

变异

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

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

以下将运行算法并将结果写回内存图
CALL gds.nodeSimilarity.filtered.mutate('myGraph',{
    mutateRelationshipType: 'SIMILAR',
    mutateProperty: 'score',
    sourceNodeFilter:'Singer',
    targetNodeFilter:'Singer'
})

YIELD nodesCompared, relationshipsWritten
表 17. 结果
nodesCompared relationshipsWritten

3

4

从结果中可以看出,创建的关系数量与流示例中的行数相同。

突变产生的关系始终是有向的,即使输入图是无向的。如果 a → ba 的 topK,并且对称地 b → ab 的 topK(或者 a → bb → a 都是 topN),则看起来好像生成了一个无向关系。但是,它们只是两个独立产生的有向关系。

写入

对于每对节点,write 执行模式都会创建一个关系,并将它们的相似度得分作为属性写入 Neo4j 数据库。新关系的类型使用必填配置参数 writeRelationshipType 指定。新属性的名称使用必填配置参数 writeProperty 指定。结果是一个类似于 stats 的单个摘要行,但包含一些额外的指标。

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

以下将运行算法并将结果写回
CALL gds.nodeSimilarity.filtered.write('myGraph',{
    writeRelationshipType: 'SIMILAR',
    writeProperty: 'score',
    sourceNodeFilter:'Singer',
    targetNodeFilter:'Singer'
})
YIELD nodesCompared, relationshipsWritten
表 18. 结果
nodesCompared relationshipsWritten

3

4

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

写入的关系始终是有向的,即使输入图是无向的。如果 a → ba 的 topK,并且对称地 b → ab 的 topK(或者 a → bb → a 都是 topN),则看起来好像写入了无向关系。但是,它们只是两个独立写入的有向关系。