随机游走 (Random Walk)
|
在 Aura Graph Analytics 中,此功能仅通过 Python 客户端提供。它目前无法作为 Cypher 过程或函数使用。 |
术语表
- 有向
-
有向特征。该算法在有向图上定义良好。
- 有向
-
有向特征。该算法忽略图的方向。
- 有向
-
有向特征。该算法不能在有向图上运行。
- 无向
-
无向特征。该算法在无向图上定义良好。
- 无向
-
无向特征。该算法忽略图的无向性。
- 异构节点
-
异构节点完全支持。该算法有能力区分不同类型的节点。
- 异构节点
-
异构节点允许。该算法平等对待所有选定的节点,无论其标签如何。
- 异构关系
-
异构关系完全支持。该算法有能力区分不同类型的关系。
- 异构关系
-
异构关系允许。该算法平等对待所有选定的关系,无论其类型如何。
- 加权关系
-
加权特征。该算法支持将关系属性用作权重,通过 relationshipWeightProperty 配置参数指定。
- 加权关系
-
加权特征。该算法将每个关系视为同等重要,忽略任何关系权重值。
- 节点属性
-
节点属性特征。该算法使用节点属性。
随机游走是一种在图中提供随机路径的算法。
随机游走模拟了图的一种遍历方式,其中被遍历的关系是随机选择的。在经典的随机游走中,每个关系被选中的概率相同(或按权重分配)。此概率不受之前访问过的节点影响。Neo4j 图数据科学 (GDS) 库的随机游走实现支持二阶随机游走的概念。该方法尝试基于当前访问的节点 v、当前节点之前的节点 t 以及候选关系的目标节点 x 来建模转移概率。因此,随机游走受两个参数影响:returnFactor(返回因子)和 inOutFactor(进出因子)。
-
如果
t等于x,即随机游走返回到之前访问的节点时,使用returnFactor。 -
如果从
t到x的距离等于 2,即游走进一步远离节点t时,使用inOutFactor。
在随机游走期间遍历关系的概率可以通过指定 relationshipWeightProperty 进一步受到影响。大于 1 的关系属性值将增加遍历该关系的概率,介于 0 和 1 之间的属性值将降低该概率。
若要获得转移概率与之前访问过的节点无关的随机游走,可以将 returnFactor 和 inOutFactor 均设置为 1.0。 |
|
运行此算法需要足够的可用内存。在运行之前,建议您阅读 内存估计 (Memory Estimation)。 |
语法
CALL gds.randomWalk.stream(
graphName: String,
configuration: Map
)
YIELD
nodeIds: List of Integer,
path: Path
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
sourceNodes |
整数列表 |
|
是 |
用于执行随机游走的节点列表。 |
walkLength |
整数 |
|
是 |
单次随机游走的步数。 |
walksPerNode |
整数 |
|
是 |
为每个节点生成的随机游走次数。 |
inOutFactor |
浮点数 |
|
是 |
随机游走倾向于停留在起始节点附近还是在图中向外扩散。值越大,越倾向于局部停留。 |
returnFactor |
浮点数 |
|
是 |
随机游走倾向于返回上次访问的节点的程度。低于 1.0 的值表示倾向性更高。 |
字符串 |
|
是 |
用作权重的关系属性名称,用于影响随机游走的概率。权重需要 >= 0。如果未指定,算法将以无权重方式运行。 |
|
randomSeed |
整数 |
|
是 |
用于生成随机游走的随机数生成器的种子值。 |
walkBufferSize |
整数 |
|
是 |
开始训练前要完成的随机游走次数。 |
| 名称 | 类型 | 描述 |
|---|---|---|
|
整数列表 |
随机游走的节点。 |
|
路径 |
随机游走的 |
CALL gds.randomWalk.stats(
graphName: String,
configuration: Map
)
YIELD
preProcessingMillis: Integer,
computeMillis: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
sourceNodes |
整数列表 |
|
是 |
用于执行随机游走的节点列表。 |
walkLength |
整数 |
|
是 |
单次随机游走的步数。 |
walksPerNode |
整数 |
|
是 |
为每个节点生成的随机游走次数。 |
inOutFactor |
浮点数 |
|
是 |
随机游走倾向于停留在起始节点附近还是在图中向外扩散。值越大,越倾向于局部停留。 |
returnFactor |
浮点数 |
|
是 |
随机游走倾向于返回上次访问的节点的程度。低于 1.0 的值表示倾向性更高。 |
字符串 |
|
是 |
用作权重的关系属性名称,用于影响随机游走的概率。权重需要 >= 0。如果未指定,算法将以无权重方式运行。 |
|
randomSeed |
整数 |
|
是 |
用于生成随机游走的随机数生成器的种子值。 |
walkBufferSize |
整数 |
|
是 |
开始训练前要完成的随机游走次数。 |
| 名称 | 类型 | 描述 |
|---|---|---|
|
整数 |
预处理数据的毫秒数。 |
|
整数 |
运行算法的毫秒数。 |
|
Map |
用于运行算法的配置。 |
CALL gds.randomWalk.mutate(
graphName: String,
configuration: Map
)
YIELD
nodePropertiesWritten: Integer,
preProcessingMillis: Integer,
computeMillis: Integer,
mutateMillis: Integer,
postProcessingMillis: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
mutateProperty |
字符串 |
|
否 |
GDS 图中用于写入随机游走访问次数的节点属性。 |
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
sourceNodes |
整数列表 |
|
是 |
用于执行随机游走的节点列表。 |
walkLength |
整数 |
|
是 |
单次随机游走的步数。 |
walksPerNode |
整数 |
|
是 |
为每个节点生成的随机游走次数。 |
inOutFactor |
浮点数 |
|
是 |
随机游走倾向于停留在起始节点附近还是在图中向外扩散。值越大,越倾向于局部停留。 |
returnFactor |
浮点数 |
|
是 |
随机游走倾向于返回上次访问的节点的程度。低于 1.0 的值表示倾向性更高。 |
字符串 |
|
是 |
用作权重的关系属性名称,用于影响随机游走的概率。权重需要 >= 0。如果未指定,算法将以无权重方式运行。 |
|
randomSeed |
整数 |
|
是 |
用于生成随机游走的随机数生成器的种子值。 |
walkBufferSize |
整数 |
|
是 |
开始训练前要完成的随机游走次数。 |
| 名称 | 类型 | 描述 |
|---|---|---|
|
整数 |
添加到投影图中的属性数量。 |
|
整数 |
预处理数据的毫秒数。 |
|
整数 |
运行算法的毫秒数。 |
|
整数 |
向投影图添加属性的毫秒数。 |
|
整数 |
未使用。 |
|
Map |
用于运行算法的配置。 |
示例
|
以下所有示例应在空数据库中运行。 这些示例将 Cypher 投影作为规范。原生投影将在未来版本中弃用。 |
考虑由以下 Cypher 语句创建的图
CREATE (home:Page {name: 'Home'}),
(about:Page {name: 'About'}),
(product:Page {name: 'Product'}),
(links:Page {name: 'Links'}),
(a:Page {name: 'Site A'}),
(b:Page {name: 'Site B'}),
(c:Page {name: 'Site C'}),
(d:Page {name: 'Site D'}),
(home)-[:LINKS]->(about),
(about)-[:LINKS]->(home),
(product)-[:LINKS]->(home),
(home)-[:LINKS]->(product),
(links)-[:LINKS]->(home),
(home)-[:LINKS]->(links),
(links)-[:LINKS]->(a),
(a)-[:LINKS]->(home),
(links)-[:LINKS]->(b),
(b)-[:LINKS]->(home),
(links)-[:LINKS]->(c),
(c)-[:LINKS]->(home),
(links)-[:LINKS]->(d),
(d)-[:LINKS]->(home)
MATCH (source:Page)-[r:LINKS]->(target:Page)
RETURN gds.graph.project(
'myGraph',
source,
target,
{},
{ undirectedRelationshipTypes: ['*'] }
)
不指定源节点
myGraph 上运行 RandomWalk 算法CALL gds.randomWalk.stream(
'myGraph',
{
walkLength: 3,
walksPerNode: 1,
randomSeed: 42,
concurrency: 1
}
)
YIELD nodeIds, path
RETURN nodeIds, [node IN nodes(path) | node.name ] AS pages
| nodeIds | pages |
|---|---|
[0, 6, 0] |
["Home", "Site C", "Home"] |
[3, 5, 3] |
["Links", "Site B", "Links"] |
[2, 0, 1] |
["Product", "Home", "About"] |
[1, 0, 4] |
["About", "Home", "Site A"] |
[7, 3, 0] |
["Site D", "Links", "Home"] |
[6, 0, 2] |
["Site C", "Home", "Product"] |
[5, 0, 7] |
["Site B", "Home", "Site D"] |
[4, 0, 2] |
["Site A", "Home", "Product"] |
指定源节点
myGraph 上运行指定 sourceNodes 的 RandomWalk 算法MATCH (page:Page)
WHERE page.name IN ['Home', 'About']
WITH COLLECT(page) as sourceNodes
CALL gds.randomWalk.stream(
'myGraph',
{
sourceNodes: sourceNodes,
walkLength: 3,
walksPerNode: 1,
randomSeed: 42,
concurrency: 1
}
)
YIELD nodeIds, path
RETURN nodeIds, [node IN nodes(path) | node.name ] AS pages
| nodeIds | pages |
|---|---|
[0, 6, 0] |
["Home", "Site C", "Home"] |
[1, 0, 4] |
["About", "Home", "Site A"] |
统计信息 (Stats)
myGraph 上运行 RandomWalk 统计模式CALL gds.randomWalk.stats(
'myGraph',
{
walkLength: 3,
walksPerNode: 1,
randomSeed: 42,
concurrency: 1
}
)
| preProcessingMillis | computeMillis | 配置 |
|---|---|---|
0 |
1 |
{randomSeed=42, walkLength=3, jobId=b77f3147-6683-4249-8633-4db7da03f24d, sourceNodes=[], walksPerNode=1, inOutFactor=1.0, nodeLabels=[], sudo=false, relationshipTypes=[], walkBufferSize=1000, returnFactor=1.0, concurrency=1} |
Mutate
myGraph 上运行 RandomWalk 变异模式CALL gds.randomWalk.mutate(
'myGraph',
{
walkLength: 3,
walksPerNode: 1,
randomSeed: 19,
concurrency: 1,
mutateProperty: 'randomWalksCount'
}
)
YIELD nodePropertiesWritten, configuration
RETURN nodePropertiesWritten, configuration.mutateProperty AS mutateProperty
| nodePropertiesWritten | mutateProperty |
|---|---|
8 |
"randomWalksCount" |
然后,我们可以流式传输变异后的节点属性,以查看它在多少次 RandomWalk 中出现过
CALL gds.graph.nodeProperty.stream('myGraph', 'randomWalksCount')
YIELD nodeId, propertyValue
RETURN gds.util.asNode(nodeId).name AS page, propertyValue AS randomWalksCount
ORDER BY page ASC
| page | randomWalksCount |
|---|---|
"About" |
1 |
"Home" |
6 |
"Links" |
6 |
"Product" |
1 |
"Site A" |
3 |
"Site B" |
1 |
"Site C" |
4 |
"Site D" |
2 |