节点相似性

本节描述了 Neo4j 图数据科学库中的节点相似性算法。该算法基于 Jaccard 和 Overlap 相似性度量。

词汇表

有向

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

有向

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

有向

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

无向

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

无向

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

异构节点

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

异构节点

异构节点允许。该算法无论节点的标签如何,都以相似的方式处理所有选定的节点。

异构关系

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

异构关系

异构关系允许。该算法无论关系的类型如何,都以相似的方式处理所有选定的关系。

加权关系

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

加权关系

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

简介

节点相似性算法根据节点连接到的节点集来比较一组节点。如果两个节点共享许多相同的邻居,则它们被认为是相似的。节点相似性基于 Jaccard 度量(也称为 Jaccard 相似性分数)、Overlap 系数(也称为 Szymkiewicz–Simpson 系数)和余弦相似性分数计算成对相似性。前两个最常与非加权集相关联,而余弦则与加权输入相关联。

给定两个集合 AB,Jaccard 相似性使用以下公式计算:

jacard nodesim

Overlap 系数使用以下公式计算:

overlap nodesim

加权情况下的公式可以在下面的加权示例中找到。

余弦相似性分数使用以下公式计算,当 A、B 未加权时,条目隐含地给定权重1

cos

此算法的输入是一个二分连通图,包含两个不相交的节点集。每个关系都从第一个节点集中的一个节点开始,并在第二个节点集中的一个节点结束。

节点相似性算法比较每个具有出站关系的节点与其他此类节点。对于每个节点n,我们收集该节点的出站邻域N(n),即所有节点m,使得存在从nm的关系。对于每对nm,算法计算该对的相似性,该相似性等于所选相似性度量对N(n)N(m)的结果。

节点相似性具有 O(n3) 的时间复杂度和 O(n2) 的空间复杂度。我们以 O(n2) 的时间和空间计算并存储邻居集,然后以 O(n3) 的时间计算成对相似性分数。

为了限制内存使用,您可以明确限制每个节点输出的结果数量,这就是“topK”参数。它可以设置为除 0 以外的任何值。当然,您会损失整体计算的精度,并且运行时间不受影响——我们仍然必须先计算结果,然后才可能丢弃它们。

算法的输出是第一个节点集对之间的新关系。相似性分数通过关系属性表示。

有关此算法的更多信息,请参阅

还可以对生成的相似性对中的源节点和/或目标节点应用过滤。为此,您可以考虑过滤的节点相似性算法。

运行此算法需要足够的可用内存。在运行此算法之前,我们建议您阅读内存估算

语法

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

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

graphName

字符串

不适用

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

配置

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [1]

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

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

用于计算相似性的度量。可以是 JACCARDOVERLAPCOSINE

useComponents

布尔值或字符串

false

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

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

表 3. 结果
名称 类型 描述

node1

整数

第一个节点的节点 ID。

node2

整数

第二个节点的节点 ID。

similarity

浮点数

两个节点的相似性分数。

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

graphName

字符串

不适用

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

配置

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [2]

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

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

用于计算相似性的度量。可以是 JACCARDOVERLAPCOSINE

useComponents

布尔值或字符串

false

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

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

表 6. 结果
名称 类型 描述

preProcessingMillis

整数

预处理数据所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

postProcessingMillis

整数

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

nodesCompared

整数

已计算相似性的节点数量。

similarityPairs

整数

结果中的相似性数量。

similarityDistribution

映射

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

配置

映射

用于运行算法的配置。

在目录中存储的图上以变异模式运行节点相似性。
CALL gds.nodeSimilarity.mutate(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  mutateMillis: Integer,
  postProcessingMillis: Integer,
  relationshipsWritten: Integer,
  nodesCompared: Integer,
  similarityDistribution: Map,
  configuration: Map
表 7. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

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

配置

映射

{}

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

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

mutateRelationshipType

字符串

不适用

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

mutateProperty

字符串

不适用

写入相似性分数的 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

用于计算相似性的度量。可以是 JACCARDOVERLAPCOSINE

useComponents

布尔值或字符串

false

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

表 9. 结果
名称 类型 描述

preProcessingMillis

整数

预处理数据所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

mutateMillis

整数

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

postProcessingMillis

整数

计算百分位数所用的毫秒数。

nodesCompared

整数

已计算相似性的节点数量。

relationshipsWritten

整数

创建的关系数量。

similarityDistribution

映射

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

配置

映射

用于运行算法的配置。

在目录中存储的图上以写入模式运行节点相似性。
CALL gds.nodeSimilarity.write(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  writeMillis: Integer,
  postProcessingMillis: Integer,
  nodesCompared: Integer,
  relationshipsWritten: Integer,
  similarityDistribution: Map,
  configuration: Map
表 10. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

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

配置

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [3]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

writeConcurrency

整数

'concurrency' 的值

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

writeRelationshipType

字符串

不适用

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

writeProperty

字符串

不适用

写入相似性分数的 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

用于计算相似性的度量。可以是 JACCARDOVERLAPCOSINE

useComponents

布尔值或字符串

false

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

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

表 12. 结果
名称 类型 描述

preProcessingMillis

整数

预处理数据所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

writeMillis

整数

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

postProcessingMillis

整数

计算百分位数所用的毫秒数。

nodesCompared

整数

已计算相似性的节点数量。

relationshipsWritten

整数

创建的关系数量。

similarityDistribution

映射

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

配置

映射

用于运行算法的配置。

示例

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

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

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

Visualization of the example graph
以下 Cypher 语句将在 Neo4j 数据库中创建示例图:
CREATE
  (alice:Person {name: 'Alice'}),
  (bob:Person {name: 'Bob'}),
  (carol:Person {name: 'Carol'}),
  (dave:Person {name: 'Dave'}),
  (eve:Person {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 {strength: 1.5}]->(trumpet),
  (dave)-[:LIKES]->(bongos);

此二分图有两个节点集:Person 节点和 Instrument 节点。这两个节点集通过 LIKES 关系连接。每个关系都从 Person 节点开始,并在 Instrument 节点结束。

在本例中,我们希望使用节点相似性算法根据人们喜欢的乐器来比较人。

节点相似性算法将只计算度至少为 1 的节点的相似性。在示例图中,Eve 节点将不会与其他人节点进行比较。

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

在以下示例中,我们将演示在此图上使用节点相似性算法。

内存估算

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

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

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

9

9

2384

2600

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

流式

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

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

以下将运行算法,并流式传输结果
CALL gds.nodeSimilarity.stream('myGraph')
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
表 14. 结果
人物 1 人物 2 similarity

"爱丽丝"

"鲍勃"

0.6666666666666666

"鲍勃"

"爱丽丝"

0.6666666666666666

"爱丽丝"

"戴夫"

0.5

"戴夫"

"爱丽丝"

0.5

"爱丽丝"

"卡罗尔"

0.3333333333333333

"卡罗尔"

"爱丽丝"

0.3333333333333333

"卡罗尔"

"戴夫"

0.3333333333333333

"戴夫"

"卡罗尔"

0.3333333333333333

"鲍勃"

"戴夫"

0.25

"戴夫"

"鲍勃"

0.25

我们使用过程配置参数的默认值。TopK 设置为 10,topN 设置为 0。因此,结果集包含每个节点的前 10 个相似度分数。

如果我们想比较乐器之间,那么我们将使用REVERSE方向投影LIKES关系类型。这将返回乐器对的相似性,并且不计算人物之间的任何相似性。

统计

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

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

以下将运行算法并以统计和测量值的形式返回结果
CALL gds.nodeSimilarity.stats('myGraph')
YIELD nodesCompared, similarityPairs
表 15. 结果
nodesCompared similarityPairs

4

10

变异

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

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

以下将运行算法,并将结果写回内存图
CALL gds.nodeSimilarity.mutate('myGraph', {
    mutateRelationshipType: 'SIMILAR',
    mutateProperty: 'score'
})
YIELD nodesCompared, relationshipsWritten
表 16. 结果
nodesCompared relationshipsWritten

4

10

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

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

写入

write执行模式为每对节点创建一个关系,并将它们的相似性分数作为属性写入 Neo4j 数据库。新关系的类型使用强制配置参数writeRelationshipType指定。新属性的名称使用强制配置参数writeProperty指定。结果是一个单一的摘要行,类似于stats,但带有一些附加指标。

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

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

4

10

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

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

限制结果

相似性结果可以应用四种限制。“Top”限制结果为最高相似性分数。“Bottom”限制结果为最低相似性分数。Top 和 bottom 限制既可以应用于整个结果(“N”),也可以应用于每个节点的结果(“K”)。

必须始终存在“K”限制,无论是 bottomK 还是 topK,并且必须是正数。topK 和 bottomK 的默认值为 10。

表 18. 结果限制
总结果 每个节点的结果

最高分

topN

topK

最低分

bottomN

bottomK

topK 和 bottomK

TopK 和 bottomK 是每个节点计算分数数量的限制。对于 topK,返回每个节点的 K 个最大相似性分数。对于 bottomK,返回每个节点的 K 个最小相似性分数。TopK 和 bottomK 不能为 0,不能同时使用,默认值为 10。如果两者均未指定,则使用 topK。

以下将运行算法,并流式传输每个节点的前 1 个结果
CALL gds.nodeSimilarity.stream('myGraph', { topK: 1 })
YIELD node1, node2, similarity
RETURN gds.util.asNode(node1).name AS Person1, gds.util.asNode(node2).name AS Person2, similarity
ORDER BY Person1
表 19. 结果
人物 1 人物 2 similarity

"爱丽丝"

"鲍勃"

0.666666666666667

"鲍勃"

"爱丽丝"

0.666666666666667

"卡罗尔"

"爱丽丝"

0.333333333333333

"戴夫"

"爱丽丝"

0.5

以下将运行算法,并流式传输每个节点的最后 1 个结果
CALL gds.nodeSimilarity.stream('myGraph', { bottomK: 1 })
YIELD node1, node2, similarity
RETURN gds.util.asNode(node1).name AS Person1, gds.util.asNode(node2).name AS Person2, similarity
ORDER BY Person1
表 20. 结果
人物 1 人物 2 similarity

"爱丽丝"

"卡罗尔"

0.3333333333333333

"鲍勃"

"戴夫"

0.25

"卡罗尔"

"爱丽丝"

0.3333333333333333

"戴夫"

"鲍勃"

0.25

topN 和 bottomN

TopN 和 bottomN 限制了所有节点的相似性分数数量。这是对总结果集的限制,除了对每个节点结果的 topK 或 bottomK 限制之外。对于 topN,返回 N 个最大的相似性分数。对于 bottomN,返回 N 个最小的相似性分数。值为 0 表示不施加全局限制,并返回 topK 或 bottomK 的所有结果。

以下将运行算法,并流式传输每个节点的前 1 个结果中最高的 3 个
CALL gds.nodeSimilarity.stream('myGraph', { topK: 1, topN: 3 })
YIELD node1, node2, similarity
RETURN gds.util.asNode(node1).name AS Person1, gds.util.asNode(node2).name AS Person2, similarity
ORDER BY similarity DESC, Person1, Person2
表 21. 结果
人物 1 人物 2 similarity

"爱丽丝"

"鲍勃"

0.6666666667

"鲍勃"

"爱丽丝"

0.6666666667

"戴夫"

"爱丽丝"

0.5

度截止和相似度截止

节点相似度可以通过两个整数参数degreeCutoffupperDegreeCutoff来调整以忽略基于度约束的某些节点。如果设置了degreeCutoff,它会强制要求节点的度数有一个下限,以便在比较中考虑该节点,并跳过度数低于degreeCutoff的任何节点。如果设置了upperDegreeCutoff,它会强制要求节点的度数有一个上限,并跳过度数高于upperDegreeCutoff的任何节点。这两个参数也可以组合使用,以便只考虑度数落在某个特定范围内的节点。

这两个参数的最小值均为1

以下将忽略喜欢关系少于 3 个的节点
CALL gds.nodeSimilarity.stream('myGraph', { degreeCutoff: 3 })
YIELD node1, node2, similarity
RETURN gds.util.asNode(node1).name AS Person1, gds.util.asNode(node2).name AS Person2, similarity
ORDER BY Person1
表 22. 结果
人物 1 人物 2 similarity

"爱丽丝"

"戴夫"

0.5

"戴夫"

"爱丽丝"

0.5

相似性截止值是结果中相似性分数的下限。默认值非常小(1E-42),以排除相似性分数为 0 的结果。

将相似性截止值设置为 0 可能会产生非常大的结果集,增加运行时间和内存消耗。

以下将忽略相似性分数小于 0.5 的节点对
CALL gds.nodeSimilarity.stream('myGraph', { similarityCutoff: 0.5 })
YIELD node1, node2, similarity
RETURN gds.util.asNode(node1).name AS Person1, gds.util.asNode(node2).name AS Person2, similarity
ORDER BY Person1
表 23. 结果
人物 1 人物 2 similarity

"爱丽丝"

"鲍勃"

0.666666666666667

"爱丽丝"

"戴夫"

0.5

"鲍勃"

"爱丽丝"

0.6666666666666666

"戴夫"

"爱丽丝"

0.5

加权相似度

关系属性可以用来修改由特定关系引起的相似性,方法是将其值作为衡量重要性的一种方式。默认情况下,加权节点相似性使用加权 Jaccard 相似性,根据以下公式:

weighted jaccard

形式上,给定两个节点及其加权邻居列表A'B',我们将列表扩展到AB,通过将任何非邻居的权重设置为0来索引其邻居的并集A' ∪ B',然后应用加权 Jaccard 相似性。

它还支持加权 Overlap 相似性,根据以下公式:

weighted overlap

此外,加权情况下也可以使用余弦相似性,如简介中所述。

加权相似性度量仅对大于或等于 0 的值定义。

以下查询将在相似性计算中考虑关系属性
CALL gds.nodeSimilarity.stream('myGraph', { relationshipWeightProperty: 'strength', similarityCutoff: 0.3 })
YIELD node1, node2, similarity
RETURN gds.util.asNode(node1).name AS Person1, gds.util.asNode(node2).name AS Person2, similarity
ORDER BY Person1
表 24. 结果
人物 1 人物 2 similarity

"爱丽丝"

"鲍勃"

0.8

"爱丽丝"

"戴夫"

0.333333333333333

"鲍勃"

"爱丽丝"

0.8

"戴夫"

"爱丽丝"

0.333333333333333

可以看出,与该算法的非加权版本相比,Alice 和 Dave 之间的相似性降低了(从 0.5 降至 0.33)。

Alice 喜欢吉他、合成器和邦戈鼓,强度分别为(1, 1, 0.5)。Dave 喜欢吉他、邦戈鼓和小号,强度分别为(1, 1, 1.5)。因此,取 Alice 和 Dave 的邻居,我们得到 Alice 的强度列表为A = (1, 1, 0.5, 0),Dave 的强度列表为B = (1, 0, 1, 1.5),索引为吉他、合成器、邦戈鼓、小号

因此,Alice 和 Dave 的加权 (Jaccard) 节点相似性为:

weighted jaccard example

类似地,Alice 和 Bob 之间的相似性增加了(从 0.66 到 0.8),因为缺少喜欢的乐器对相似性分数的影响较小。

© . All rights reserved.