Node2Vec

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

词汇表

有向

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

有向

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

有向

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

无向

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

无向

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

异构节点

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

异构节点

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

异构关系

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

异构关系

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

加权关系

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

加权关系

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

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

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

随机游走

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

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

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

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

字符串

n/a

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

在内部生成

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

logProgress

布尔值

true

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

walkLength

整数

80

单个随机游走中的步数。

walksPerNode

整数

10

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

inOutFactor

浮点数

1.0

随机游走保持靠近起始节点或在图中扇出的趋势。 值越高表示保持局部。

returnFactor

浮点数

1.0

随机游走返回到上次访问节点的趋势。 小于 1.0 的值表示更高的趋势。

relationshipWeightProperty

字符串

null

用作权重以影响随机游走概率的关系属性的名称。 权重需要 >= 0。 如果未指定,则算法以未加权的方式运行。

windowSize

整数

10

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

negativeSamplingRate

整数

5

为每个正样本生成的负样本数。

positiveSamplingFactor

浮点数

0.001

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

negativeSamplingExponent

浮点数

0.75

应用于节点频率以获得负采样分布的指数。 值为 1.0 时,按频率进行采样。 值为 0.0 时,每个节点都平等地采样。

embeddingDimension

整数

128

计算出的节点嵌入的大小。

embeddingInitializer

字符串

NORMALIZED

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

iterations

整数

1

训练迭代次数。

initialLearningRate

浮点数

0.01

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

minLearningRate

浮点数

0.0001

学习率的下限,因为它在训练期间会降低。

randomSeed

整数

随机

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

walkBufferSize

整数

1000

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

表 3. 结果
名称 类型 描述

nodeId

整数

Neo4j 节点 ID。

embedding

浮点数列表

计算出的节点嵌入。

在存储在目录中的图上以变异模式运行 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

字符串

n/a

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

configuration

映射

{}

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

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

mutateProperty

字符串

n/a

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

在内部生成

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

walkLength

整数

80

单个随机游走中的步数。

walksPerNode

整数

10

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

inOutFactor

浮点数

1.0

随机游走保持靠近起始节点或在图中扇出的趋势。 值越高表示保持局部。

returnFactor

浮点数

1.0

随机游走返回到上次访问节点的趋势。 小于 1.0 的值表示更高的趋势。

relationshipWeightProperty

字符串

null

用作权重以影响随机游走概率的关系属性的名称。 权重需要 >= 0。 如果未指定,则算法以未加权的方式运行。

windowSize

整数

10

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

negativeSamplingRate

整数

5

为每个正样本生成的负样本数。

positiveSamplingFactor

浮点数

0.001

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

negativeSamplingExponent

浮点数

0.75

应用于节点频率以获得负采样分布的指数。 值为 1.0 时,按频率进行采样。 值为 0.0 时,每个节点都平等地采样。

embeddingDimension

整数

128

计算出的节点嵌入的大小。

embeddingInitializer

字符串

NORMALIZED

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

iterations

整数

1

训练迭代次数。

initialLearningRate

浮点数

0.01

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

minLearningRate

浮点数

0.0001

学习率的下限,因为它在训练期间会降低。

randomSeed

整数

随机

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

walkBufferSize

整数

1000

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

表 6. 结果
名称 类型 描述

nodeCount

整数

处理的节点数。

nodePropertiesWritten

整数

写入的节点属性数。

preProcessingMillis

整数

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

computeMillis

整数

运行算法所用的毫秒数。

mutateMillis

整数

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

postProcessingMillis

整数

结果的后处理所用的毫秒数。

lossPerIteration

浮点数列表

每个训练迭代注册的损失总和。

configuration

映射

用于运行算法的配置。

在存储在目录中的图上以写入模式运行 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

字符串

n/a

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

在内部生成

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

logProgress

布尔值

true

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

writeConcurrency

整数

“concurrency”的值

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

writeProperty

字符串

n/a

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

walkLength

整数

80

单个随机游走中的步数。

walksPerNode

整数

10

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

inOutFactor

浮点数

1.0

随机游走保持靠近起始节点或在图中扇出的趋势。 值越高表示保持局部。

returnFactor

浮点数

1.0

随机游走返回到上次访问节点的趋势。 小于 1.0 的值表示更高的趋势。

relationshipWeightProperty

字符串

null

用作权重以影响随机游走概率的关系属性的名称。 权重需要 >= 0。 如果未指定,则算法以未加权的方式运行。

windowSize

整数

10

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

negativeSamplingRate

整数

5

为每个正样本生成的负样本数。

positiveSamplingFactor

浮点数

0.001

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

negativeSamplingExponent

浮点数

0.75

应用于节点频率以获得负采样分布的指数。 值为 1.0 时,按频率进行采样。 值为 0.0 时,每个节点都平等地采样。

embeddingDimension

整数

128

计算出的节点嵌入的大小。

embeddingInitializer

字符串

NORMALIZED

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

iterations

整数

1

训练迭代次数。

initialLearningRate

浮点数

0.01

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

minLearningRate

浮点数

0.0001

学习率的下限,因为它在训练期间会降低。

randomSeed

整数

随机

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

walkBufferSize

整数

1000

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

表 9. 结果
名称 类型 描述

nodeCount

整数

处理的节点数。

nodePropertiesWritten

整数

写入的节点属性数。

preProcessingMillis

整数

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

computeMillis

整数

运行算法所用的毫秒数。

writeMillis

整数

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

lossPerIteration

浮点数列表

每个训练迭代注册的损失总和。

configuration

映射

用于运行算法的配置。

示例

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

这些示例使用 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]