Node2Vec
此功能处于 Beta 阶段。有关功能分层的更多信息,请参阅 API 层级。
词汇表
- 有向
-
有向特性。该算法在有向图上定义良好。
- 有向
-
有向特性。该算法忽略图的方向。
- 有向
-
有向特性。该算法不适用于有向图。
- 无向
-
无向特性。该算法在无向图上定义良好。
- 无向
-
无向特性。该算法忽略图的无向性。
- 异构节点
-
异构节点完全支持。该算法能够区分不同类型的节点。
- 异构节点
-
异构节点允许。该算法对所有选定节点一视同仁,无论其标签如何。
- 异构关系
-
异构关系完全支持。该算法能够区分不同类型的关系。
- 异构关系
-
异构关系允许。该算法对所有选定关系一视同仁,无论其类型如何。
- 加权关系
-
加权特性。该算法支持使用关系属性作为权重,通过 relationshipWeightProperty 配置参数指定。
- 加权关系
-
加权特性。该算法对每个关系都一视同仁,忽略任何关系权重的值。
Node2Vec 是一种节点嵌入算法,它根据图中的随机游走计算节点的向量表示。邻域通过随机游走进行采样。利用多个随机邻域样本,该算法训练一个单隐藏层神经网络。该神经网络旨在根据另一个节点的出现来预测节点在游走中出现的可能性。
有关此算法的更多信息,请参阅
随机游走
Node2Vec 算法的一个主要概念是二阶随机游走。随机游走模拟了图的遍历,其中被遍历的关系是随机选择的。在经典的随机游走中,每个关系被选中的概率是相同的,可能带有权重。这个概率不受先前访问过的节点影响。然而,二阶随机游走的概念试图根据当前访问的节点 v
、当前节点之前访问的节点 t
以及作为候选关系目标的节点 x
来建模转移概率。因此,Node2Vec 随机游走受到两个参数的影响:returnFactor
和 inOutFactor
-
如果
t
等于x
,即随机游走返回到先前访问的节点,则使用returnFactor
。 -
如果
t
到x
的距离等于 2,即游走进一步远离节点t
,则使用inOutFactor
。
通过指定 relationshipWeightProperty
,可以进一步影响随机游走期间遍历关系的概率。大于 1 的关系属性值将增加关系被遍历的可能性,而介于 0 和 1 之间的属性值将降低该概率。
对于图中的每个节点,Node2Vec 生成一系列以该特定节点为起始节点的随机游走。每个节点的随机游走次数可以通过 walkPerNode
配置参数来影响,游走长度由 walkLength
参数控制。
在机器学习管道中的使用
为了使机器学习模型能够做出有用的预测,在预测过程中生成的特征与模型训练过程中生成的特征具有相似的分布至关重要。此外,添加到管道中的节点属性步骤(无论是 Node2Vec 还是其他)在训练期间和训练模型的预测期间都会执行。因此,当管道包含一个在训练和预测期间产生过于不同的嵌入的嵌入步骤时,就会出现问题。
Node2Vec 生成的最终嵌入取决于生成初始节点嵌入向量时的随机性以及计算中进行的随机游走。目前,即使设置了 randomSeed
配置参数,Node2Vec 也会产生非确定性结果。因此,由于嵌入在不同运行之间不会是确定性的,Node2Vec 目前不应在管道中用作节点属性步骤,除非目的是实验性的且仅使用训练模式。
如果 Node2Vec 节点嵌入是在管道外部生成的,则将其用作管道中的特征可能仍然有用,但前提是要意识到不使用管道中数据集拆分的数据泄露风险。
语法
CALL gds.node2vec.stream(
graphName: String,
configuration: Map
) YIELD
nodeId: Integer,
embedding: List of Float
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
String |
|
否 |
存储在目录中的图的名称。 |
configuration |
Map |
|
是 |
算法特定配置和/或图筛选。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
String 列表 |
|
是 |
使用给定的节点标签筛选命名图。将包含具有任何给定标签的节点。 |
|
String 列表 |
|
是 |
使用给定的关系类型筛选命名图。将包含具有任何给定类型的关系。 |
|
Integer |
|
是 |
用于运行算法的并发线程数。 |
|
String |
|
是 |
可用于更轻松地跟踪算法进度的 ID。 |
|
Boolean |
|
是 |
如果禁用,则不会记录进度百分比。 |
|
walkLength |
Integer |
|
是 |
单个随机游走中的步数。 |
walksPerNode |
Integer |
|
是 |
为每个节点生成的随机游走次数。 |
inOutFactor |
Float |
|
是 |
随机游走停留在起始节点附近或在图中扩散的倾向。值越高表示越倾向于保持局部。 |
returnFactor |
Float |
|
是 |
随机游走返回到上次访问的节点的倾向。值低于 1.0 意味着倾向性更高。 |
String |
|
是 |
用作权重以影响随机游走概率的关系属性的名称。权重必须 >= 0。如果未指定,算法将以无权重模式运行。 |
|
windowSize |
Integer |
|
是 |
训练神经网络时的上下文窗口大小。 |
negativeSamplingRate |
Integer |
|
是 |
每个正样本产生的负样本数量。 |
positiveSamplingFactor |
Float |
|
是 |
影响正样本分布的因子。值越高,频繁节点被下采样的概率越大。 |
negativeSamplingExponent |
Float |
|
是 |
应用于节点频率以获得负采样分布的指数。值为 1.0 时按频率比例采样。值为 0.0 时每个节点等概率采样。 |
embeddingDimension |
Integer |
|
是 |
计算出的节点嵌入大小。 |
embeddingInitializer |
String |
|
是 |
初始化嵌入的方法。值从范围 |
iterations |
Integer |
|
是 |
训练迭代次数。更高的迭代次数将采样更多的随机游走,因此游走集通常会更能代表整个图。 |
initialLearningRate |
Float |
|
是 |
训练神经网络最初使用的学习率。学习率在每次训练迭代后降低。 |
minLearningRate |
Float |
|
是 |
训练期间学习率降低的下限。 |
randomSeed |
Integer |
|
是 |
用于生成随机游走的种子值,这些游走用作神经网络的训练集。请注意,生成的嵌入仍然是非确定性的。 |
walkBufferSize |
Integer |
|
是 |
在开始训练之前完成的随机游走数量。 |
名称 | 类型 | 描述 |
---|---|---|
|
Integer |
Neo4j 节点 ID。 |
|
Float 列表 |
计算出的节点嵌入。 |
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
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
String |
|
否 |
存储在目录中的图的名称。 |
configuration |
Map |
|
是 |
算法特定配置和/或图筛选。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
mutateProperty |
String |
|
否 |
将嵌入写入的 GDS 图中的节点属性。 |
String 列表 |
|
是 |
使用给定的节点标签筛选命名图。 |
|
String 列表 |
|
是 |
使用给定的关系类型筛选命名图。 |
|
Integer |
|
是 |
用于运行算法的并发线程数。 |
|
String |
|
是 |
可用于更轻松地跟踪算法进度的 ID。 |
|
walkLength |
Integer |
|
是 |
单个随机游走中的步数。 |
walksPerNode |
Integer |
|
是 |
为每个节点生成的随机游走次数。 |
inOutFactor |
Float |
|
是 |
随机游走停留在起始节点附近或在图中扩散的倾向。值越高表示越倾向于保持局部。 |
returnFactor |
Float |
|
是 |
随机游走返回到上次访问的节点的倾向。值低于 1.0 意味着倾向性更高。 |
String |
|
是 |
用作权重以影响随机游走概率的关系属性的名称。权重必须 >= 0。如果未指定,算法将以无权重模式运行。 |
|
windowSize |
Integer |
|
是 |
训练神经网络时的上下文窗口大小。 |
negativeSamplingRate |
Integer |
|
是 |
每个正样本产生的负样本数量。 |
positiveSamplingFactor |
Float |
|
是 |
影响正样本分布的因子。值越高,频繁节点被下采样的概率越大。 |
negativeSamplingExponent |
Float |
|
是 |
应用于节点频率以获得负采样分布的指数。值为 1.0 时按频率比例采样。值为 0.0 时每个节点等概率采样。 |
embeddingDimension |
Integer |
|
是 |
计算出的节点嵌入大小。 |
embeddingInitializer |
String |
|
是 |
初始化嵌入的方法。值从范围 |
iterations |
Integer |
|
是 |
训练迭代次数。更高的迭代次数将采样更多的随机游走,因此游走集通常会更能代表整个图。 |
initialLearningRate |
Float |
|
是 |
训练神经网络最初使用的学习率。学习率在每次训练迭代后降低。 |
minLearningRate |
Float |
|
是 |
训练期间学习率降低的下限。 |
randomSeed |
Integer |
|
是 |
用于生成随机游走的种子值,这些游走用作神经网络的训练集。请注意,生成的嵌入仍然是非确定性的。 |
walkBufferSize |
Integer |
|
是 |
在开始训练之前完成的随机游走数量。 |
名称 | 类型 | 描述 |
---|---|---|
nodeCount |
Integer |
处理的节点数量。 |
nodePropertiesWritten |
Integer |
写入的节点属性数量。 |
preProcessingMillis |
Integer |
数据预处理的毫秒数。 |
computeMillis |
Integer |
运行算法的毫秒数。 |
mutateMillis |
Integer |
将属性添加到投影图的毫秒数。 |
postProcessingMillis |
Integer |
结果后处理的毫秒数。 |
lossPerIteration |
Float 列表 |
每次训练迭代记录的损失总和。 |
configuration |
Map |
运行算法所使用的配置。 |
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
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
String |
|
否 |
存储在目录中的图的名称。 |
configuration |
Map |
|
是 |
算法特定配置和/或图筛选。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
String 列表 |
|
是 |
使用给定的节点标签筛选命名图。将包含具有任何给定标签的节点。 |
|
String 列表 |
|
是 |
使用给定的关系类型筛选命名图。将包含具有任何给定类型的关系。 |
|
Integer |
|
是 |
用于运行算法的并发线程数。 |
|
String |
|
是 |
可用于更轻松地跟踪算法进度的 ID。 |
|
Boolean |
|
是 |
如果禁用,则不会记录进度百分比。 |
|
Integer |
|
是 |
用于将结果写入 Neo4j 的并发线程数。 |
|
String |
|
否 |
将嵌入写入的 Neo4j 数据库中的节点属性。 |
|
walkLength |
Integer |
|
是 |
单个随机游走中的步数。 |
walksPerNode |
Integer |
|
是 |
为每个节点生成的随机游走次数。 |
inOutFactor |
Float |
|
是 |
随机游走停留在起始节点附近或在图中扩散的倾向。值越高表示越倾向于保持局部。 |
returnFactor |
Float |
|
是 |
随机游走返回到上次访问的节点的倾向。值低于 1.0 意味着倾向性更高。 |
String |
|
是 |
用作权重以影响随机游走概率的关系属性的名称。权重必须 >= 0。如果未指定,算法将以无权重模式运行。 |
|
windowSize |
Integer |
|
是 |
训练神经网络时的上下文窗口大小。 |
negativeSamplingRate |
Integer |
|
是 |
每个正样本产生的负样本数量。 |
positiveSamplingFactor |
Float |
|
是 |
影响正样本分布的因子。值越高,频繁节点被下采样的概率越大。 |
negativeSamplingExponent |
Float |
|
是 |
应用于节点频率以获得负采样分布的指数。值为 1.0 时按频率比例采样。值为 0.0 时每个节点等概率采样。 |
embeddingDimension |
Integer |
|
是 |
计算出的节点嵌入大小。 |
embeddingInitializer |
String |
|
是 |
初始化嵌入的方法。值从范围 |
iterations |
Integer |
|
是 |
训练迭代次数。更高的迭代次数将采样更多的随机游走,因此游走集通常会更能代表整个图。 |
initialLearningRate |
Float |
|
是 |
训练神经网络最初使用的学习率。学习率在每次训练迭代后降低。 |
minLearningRate |
Float |
|
是 |
训练期间学习率降低的下限。 |
randomSeed |
Integer |
|
是 |
用于生成随机游走的种子值,这些游走用作神经网络的训练集。请注意,生成的嵌入仍然是非确定性的。 |
walkBufferSize |
Integer |
|
是 |
在开始训练之前完成的随机游走数量。 |
名称 | 类型 | 描述 |
---|---|---|
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
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] |