Node2Vec

此功能处于 Beta 阶段。有关功能分层的更多信息,请参阅 API 层级

词汇表

有向

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

有向

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

有向

有向特性。该算法不适用于有向图。

无向

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

无向

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

异构节点

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

异构节点

异构节点允许。该算法对所有选定节点一视同仁,无论其标签如何。

异构关系

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

异构关系

异构关系允许。该算法对所有选定关系一视同仁,无论其类型如何。

加权关系

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

加权关系

加权特性。该算法对每个关系都一视同仁,忽略任何关系权重的值。

Node2Vec 是一种节点嵌入算法,它根据图中的随机游走计算节点的向量表示。邻域通过随机游走进行采样。利用多个随机邻域样本,该算法训练一个单隐藏层神经网络。该神经网络旨在根据另一个节点的出现来预测节点在游走中出现的可能性。

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

随机游走

Node2Vec 算法的一个主要概念是二阶随机游走。随机游走模拟了图的遍历,其中被遍历的关系是随机选择的。在经典的随机游走中,每个关系被选中的概率是相同的,可能带有权重。这个概率不受先前访问过的节点影响。然而,二阶随机游走的概念试图根据当前访问的节点 v、当前节点之前访问的节点 t 以及作为候选关系目标的节点 x 来建模转移概率。因此,Node2Vec 随机游走受到两个参数的影响:returnFactorinOutFactor

  • 如果 t 等于 x,即随机游走返回到先前访问的节点,则使用 returnFactor

  • 如果 tx 的距离等于 2,即游走进一步远离节点 t,则使用 inOutFactor

Visuzalition of random walk parameters

通过指定 relationshipWeightProperty,可以进一步影响随机游走期间遍历关系的概率。大于 1 的关系属性值将增加关系被遍历的可能性,而介于 0 和 1 之间的属性值将降低该概率。

对于图中的每个节点,Node2Vec 生成一系列以该特定节点为起始节点的随机游走。每个节点的随机游走次数可以通过 walkPerNode 配置参数来影响,游走长度由 walkLength 参数控制。

在机器学习管道中的使用

目前,在机器学习管道中将 Node2Vec 用作节点属性步骤(例如 链接预测管道节点属性预测)支持得不好,特别是如果最终目标是使用其嵌入来应用预测模型。

为了使机器学习模型能够做出有用的预测,在预测过程中生成的特征与模型训练过程中生成的特征具有相似的分布至关重要。此外,添加到管道中的节点属性步骤(无论是 Node2Vec 还是其他)在训练期间和训练模型的预测期间都会执行。因此,当管道包含一个在训练和预测期间产生过于不同的嵌入的嵌入步骤时,就会出现问题。

Node2Vec 生成的最终嵌入取决于生成初始节点嵌入向量时的随机性以及计算中进行的随机游走。目前,即使设置了 randomSeed 配置参数,Node2Vec 也会产生非确定性结果。因此,由于嵌入在不同运行之间不会是确定性的,Node2Vec 目前不应在管道中用作节点属性步骤,除非目的是实验性的且仅使用训练模式。

如果 Node2Vec 节点嵌入是在管道外部生成的,则将其用作管道中的特征可能仍然有用,但前提是要意识到不使用管道中数据集拆分的数据泄露风险。

语法

Node2Vec 每种模式的语法
在命名图上以流模式运行 Node2Vec。
CALL gds.node2vec.stream(
  graphName: String,
  configuration: Map
) YIELD
  nodeId: Integer,
  embedding: List of Float
表 1. 参数
名称 类型 默认值 可选 描述

graphName

String

不适用

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

configuration

Map

{}

算法特定配置和/或图筛选。

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

nodeLabels

String 列表

['*']

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

relationshipTypes

String 列表

['*']

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

concurrency

Integer

4 [1]

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

jobId

String

内部生成

可用于更轻松地跟踪算法进度的 ID。

logProgress

Boolean

true

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

walkLength

Integer

80

单个随机游走中的步数。

walksPerNode

Integer

10

为每个节点生成的随机游走次数。

inOutFactor

Float

1.0

随机游走停留在起始节点附近或在图中扩散的倾向。值越高表示越倾向于保持局部。

returnFactor

Float

1.0

随机游走返回到上次访问的节点的倾向。值低于 1.0 意味着倾向性更高。

relationshipWeightProperty

String

null

用作权重以影响随机游走概率的关系属性的名称。权重必须 >= 0。如果未指定,算法将以无权重模式运行。

windowSize

Integer

10

训练神经网络时的上下文窗口大小。

negativeSamplingRate

Integer

5

每个正样本产生的负样本数量。

positiveSamplingFactor

Float

0.001

影响正样本分布的因子。值越高,频繁节点被下采样的概率越大。

negativeSamplingExponent

Float

0.75

应用于节点频率以获得负采样分布的指数。值为 1.0 时按频率比例采样。值为 0.0 时每个节点等概率采样。

embeddingDimension

Integer

128

计算出的节点嵌入大小。

embeddingInitializer

String

NORMALIZED

初始化嵌入的方法。值从范围 [-a, a] 中均匀采样。使用 NORMALIZED 时,a=0.5/embeddingDimension;而使用 UNIFORM 时,a=1

iterations

Integer

1

训练迭代次数。更高的迭代次数将采样更多的随机游走,因此游走集通常会更能代表整个图。

initialLearningRate

Float

0.01

训练神经网络最初使用的学习率。学习率在每次训练迭代后降低。

minLearningRate

Float

0.0001

训练期间学习率降低的下限。

randomSeed

Integer

random

用于生成随机游走的种子值,这些游走用作神经网络的训练集。请注意,生成的嵌入仍然是非确定性的。

walkBufferSize

Integer

1000

在开始训练之前完成的随机游走数量。

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

表 3. 结果
名称 类型 描述

nodeId

Integer

Neo4j 节点 ID。

embedding

Float 列表

计算出的节点嵌入。

在目录中存储的图上以变异模式运行 Node2Vec。
CALL gds.node2vec.mutate(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  mutateMillis: Integer,
  nodeCount: Integer,
  nodePropertiesWritten: Integer,
  lossPerIteration: List of Float,
  configuration: Map
表 4. 参数
名称 类型 默认值 可选 描述

graphName

String

不适用

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

configuration

Map

{}

算法特定配置和/或图筛选。

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

mutateProperty

String

不适用

将嵌入写入的 GDS 图中的节点属性。

nodeLabels

String 列表

['*']

使用给定的节点标签筛选命名图。

relationshipTypes

String 列表

['*']

使用给定的关系类型筛选命名图。

concurrency

Integer

4

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

jobId

String

内部生成

可用于更轻松地跟踪算法进度的 ID。

walkLength

Integer

80

单个随机游走中的步数。

walksPerNode

Integer

10

为每个节点生成的随机游走次数。

inOutFactor

Float

1.0

随机游走停留在起始节点附近或在图中扩散的倾向。值越高表示越倾向于保持局部。

returnFactor

Float

1.0

随机游走返回到上次访问的节点的倾向。值低于 1.0 意味着倾向性更高。

relationshipWeightProperty

String

null

用作权重以影响随机游走概率的关系属性的名称。权重必须 >= 0。如果未指定,算法将以无权重模式运行。

windowSize

Integer

10

训练神经网络时的上下文窗口大小。

negativeSamplingRate

Integer

5

每个正样本产生的负样本数量。

positiveSamplingFactor

Float

0.001

影响正样本分布的因子。值越高,频繁节点被下采样的概率越大。

negativeSamplingExponent

Float

0.75

应用于节点频率以获得负采样分布的指数。值为 1.0 时按频率比例采样。值为 0.0 时每个节点等概率采样。

embeddingDimension

Integer

128

计算出的节点嵌入大小。

embeddingInitializer

String

NORMALIZED

初始化嵌入的方法。值从范围 [-a, a] 中均匀采样。使用 NORMALIZED 时,a=0.5/embeddingDimension;而使用 UNIFORM 时,a=1

iterations

Integer

1

训练迭代次数。更高的迭代次数将采样更多的随机游走,因此游走集通常会更能代表整个图。

initialLearningRate

Float

0.01

训练神经网络最初使用的学习率。学习率在每次训练迭代后降低。

minLearningRate

Float

0.0001

训练期间学习率降低的下限。

randomSeed

Integer

random

用于生成随机游走的种子值,这些游走用作神经网络的训练集。请注意,生成的嵌入仍然是非确定性的。

walkBufferSize

Integer

1000

在开始训练之前完成的随机游走数量。

表 6. 结果
名称 类型 描述

nodeCount

Integer

处理的节点数量。

nodePropertiesWritten

Integer

写入的节点属性数量。

preProcessingMillis

Integer

数据预处理的毫秒数。

computeMillis

Integer

运行算法的毫秒数。

mutateMillis

Integer

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

postProcessingMillis

Integer

结果后处理的毫秒数。

lossPerIteration

Float 列表

每次训练迭代记录的损失总和。

configuration

Map

运行算法所使用的配置。

在目录中存储的图上以写入模式运行 Node2Vec。
CALL gds.node2vec.write(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  writeMillis: Integer,
  nodeCount: Integer,
  nodePropertiesWritten: Integer,
  lossPerIteration: List of Float,
  configuration: Map
表 7. 参数
名称 类型 默认值 可选 描述

graphName

String

不适用

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

configuration

Map

{}

算法特定配置和/或图筛选。

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

nodeLabels

String 列表

['*']

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

relationshipTypes

String 列表

['*']

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

concurrency

Integer

4 [2]

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

jobId

String

内部生成

可用于更轻松地跟踪算法进度的 ID。

logProgress

Boolean

true

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

writeConcurrency

Integer

'concurrency' 的值

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

writeProperty

String

不适用

将嵌入写入的 Neo4j 数据库中的节点属性。

walkLength

Integer

80

单个随机游走中的步数。

walksPerNode

Integer

10

为每个节点生成的随机游走次数。

inOutFactor

Float

1.0

随机游走停留在起始节点附近或在图中扩散的倾向。值越高表示越倾向于保持局部。

returnFactor

Float

1.0

随机游走返回到上次访问的节点的倾向。值低于 1.0 意味着倾向性更高。

relationshipWeightProperty

String

null

用作权重以影响随机游走概率的关系属性的名称。权重必须 >= 0。如果未指定,算法将以无权重模式运行。

windowSize

Integer

10

训练神经网络时的上下文窗口大小。

negativeSamplingRate

Integer

5

每个正样本产生的负样本数量。

positiveSamplingFactor

Float

0.001

影响正样本分布的因子。值越高,频繁节点被下采样的概率越大。

negativeSamplingExponent

Float

0.75

应用于节点频率以获得负采样分布的指数。值为 1.0 时按频率比例采样。值为 0.0 时每个节点等概率采样。

embeddingDimension

Integer

128

计算出的节点嵌入大小。

embeddingInitializer

String

NORMALIZED

初始化嵌入的方法。值从范围 [-a, a] 中均匀采样。使用 NORMALIZED 时,a=0.5/embeddingDimension;而使用 UNIFORM 时,a=1

iterations

Integer

1

训练迭代次数。更高的迭代次数将采样更多的随机游走,因此游走集通常会更能代表整个图。

initialLearningRate

Float

0.01

训练神经网络最初使用的学习率。学习率在每次训练迭代后降低。

minLearningRate

Float

0.0001

训练期间学习率降低的下限。

randomSeed

Integer

random

用于生成随机游走的种子值,这些游走用作神经网络的训练集。请注意,生成的嵌入仍然是非确定性的。

walkBufferSize

Integer

1000

在开始训练之前完成的随机游走数量。

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

表 9. 结果
名称 类型 描述

nodeCount

Integer

处理的节点数量。

nodePropertiesWritten

Integer

写入的节点属性数量。

preProcessingMillis

Integer

数据预处理的毫秒数。

computeMillis

Integer

运行算法的毫秒数。

writeMillis

Integer

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

lossPerIteration

Float 列表

每次训练迭代记录的损失总和。

configuration

Map

运行算法所使用的配置。

示例

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

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

考虑以下 Cypher 语句创建的图

CREATE (alice:Person {name: 'Alice'})
CREATE (bob:Person {name: 'Bob'})
CREATE (carol:Person {name: 'Carol'})
CREATE (dave:Person {name: 'Dave'})
CREATE (eve:Person {name: 'Eve'})
CREATE (guitar:Instrument {name: 'Guitar'})
CREATE (synth:Instrument {name: 'Synthesizer'})
CREATE (bongos:Instrument {name: 'Bongos'})
CREATE (trumpet:Instrument {name: 'Trumpet'})

CREATE (alice)-[:LIKES]->(guitar)
CREATE (alice)-[:LIKES]->(synth)
CREATE (alice)-[:LIKES]->(bongos)
CREATE (bob)-[:LIKES]->(guitar)
CREATE (bob)-[:LIKES]->(synth)
CREATE (carol)-[:LIKES]->(bongos)
CREATE (dave)-[:LIKES]->(guitar)
CREATE (dave)-[:LIKES]->(synth)
CREATE (dave)-[:LIKES]->(bongos);
MATCH (source:Person)-[r:LIKES]->(target:Instrument)
RETURN gds.graph.project(
  'myGraph',
  source,
  target
)
myGraph 上运行 Node2Vec 算法
CALL gds.node2vec.stream('myGraph', {embeddingDimension: 2})
YIELD nodeId, embedding
RETURN nodeId, embedding
表 10. 结果
nodeId embedding

0

[-0.14295829832553864, 0.08884537220001221]

1

[0.016700705513358116, 0.2253911793231964]

2

[-0.06589698046445847, 0.042405471205711365]

3

[0.05862073227763176, 0.1193704605102539]

4

[0.10888434946537018, -0.18204474449157715]

5

[0.16728264093399048, 0.14098615944385529]

6

[-0.007779224775731564, 0.02114257402718067]

7

[-0.213893860578537, 0.06195802614092827]

8

[0.2479933649301529, -0.137322798371315]

© . All rights reserved.