随机游走
词汇表
- 有向
-
有向特征。该算法在有向图上定义良好。
- 有向
-
有向特征。该算法忽略图的方向。
- 有向
-
有向特征。该算法不能在有向图上运行。
- 无向
-
无向特征。该算法在无向图上定义良好。
- 无向
-
无向特征。该算法忽略图的无向性。
- 异构节点
-
异构节点完全支持。该算法能够区分不同类型的节点。
- 异构节点
-
异构节点允许。该算法对所有选定的节点进行类似的处理,而不管其标签如何。
- 异构关系
-
异构关系完全支持。该算法能够区分不同类型的关系。
- 异构关系
-
异构关系允许。该算法对所有选定的关系进行类似的处理,而不管其类型如何。
- 加权关系
-
加权特征。该算法支持使用关系属性作为权重,通过relationshipWeightProperty 配置参数指定。
- 加权关系
-
加权特征。该算法将每种关系视为同等重要,丢弃任何关系权重的值。
随机游走是一种在图中提供随机路径的算法。
随机游走模拟图的遍历,其中遍历的关系是随机选择的。在经典的随机游走中,每种关系都有相同(可能加权)的被选中的概率。此概率不受之前访问的节点的影响。Neo4j 图数据科学库的随机游走实现支持二阶随机游走概念。此方法尝试根据当前访问的节点v
、之前访问的节点t
以及候选关系的目标节点x
来建模转移概率。因此,随机游走受两个参数的影响:returnFactor
和 inOutFactor
。
-
如果
t
等于x
,即随机游走返回到之前访问的节点,则使用returnFactor
。 -
如果
t
到x
的距离等于2,即游走进一步远离节点t
,则使用inOutFactor
。
通过指定relationshipWeightProperty
,可以进一步影响随机游走期间遍历关系的概率。关系属性值大于1将增加关系被遍历的可能性,属性值介于0和1之间将降低该概率。
要获得一个转移概率独立于之前访问的节点的随机游走,可以将returnFactor 和inOutFactor 都设置为1.0。 |
运行此算法需要足够的内存可用性。在运行此算法之前,我们建议您阅读内存估算。 |
语法
CALL gds.randomWalk.stream(
graphName: String,
configuration: Map
)
YIELD
nodeIds: List of Integer,
path: Path
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。将包含具有任何给定类型的关系。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供的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 |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。将包含具有任何给定类型的关系。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供的ID,以便更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,则不会记录进度百分比。 |
|
sourceNodes |
整数列表 |
|
是 |
从中进行随机游走的节点列表。 |
walkLength |
整数 |
|
是 |
单个随机游走中的步数。 |
walksPerNode |
整数 |
|
是 |
为每个节点生成的随机游走数量。 |
inOutFactor |
浮点数 |
|
是 |
随机游走倾向于靠近起始节点或在图中扇形展开。值越高表示保持本地。 |
returnFactor |
浮点数 |
|
是 |
随机游走返回到上次访问节点的倾向。低于1.0的值表示更高的倾向。 |
字符串 |
|
是 |
用作权重以影响随机游走概率的关系属性的名称。权重需要>= 0。如果未指定,则算法将运行无权重。 |
|
randomSeed |
整数 |
|
是 |
用于生成随机游走的随机数生成器的种子值。 |
walkBufferSize |
整数 |
|
是 |
在开始训练之前要完成的随机游走数量。 |
名称 | 类型 | 描述 |
---|---|---|
|
整数 |
预处理数据所用的毫秒数。 |
|
整数 |
运行算法所用的毫秒数。 |
|
映射 |
用于运行算法的配置。 |
CALL gds.randomWalk.mutate(
graphName: String,
configuration: Map
)
YIELD
nodePropertiesWritten: Integer,
preProcessingMillis: Integer,
computeMillis: Integer,
mutateMillis: Integer,
postProcessingMillis: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
mutateProperty |
字符串 |
|
否 |
GDS 图中将随机游走访问计数写入的节点属性。 |
sourceNodes |
整数列表 |
|
是 |
从中进行随机游走的节点列表。 |
walkLength |
整数 |
|
是 |
单个随机游走中的步数。 |
walksPerNode |
整数 |
|
是 |
为每个节点生成的随机游走数量。 |
inOutFactor |
浮点数 |
|
是 |
随机游走倾向于靠近起始节点或在图中扇形展开。值越高表示保持本地。 |
returnFactor |
浮点数 |
|
是 |
随机游走返回到上次访问节点的倾向。低于1.0的值表示更高的倾向。 |
字符串 |
|
是 |
用作权重以影响随机游走概率的关系属性的名称。权重需要>= 0。如果未指定,则算法将运行无权重。 |
|
randomSeed |
整数 |
|
是 |
用于生成随机游走的随机数生成器的种子值。 |
walkBufferSize |
整数 |
|
是 |
在开始训练之前要完成的随机游走数量。 |
名称 | 类型 | 描述 |
---|---|---|
|
整数 |
添加到投影图中的属性数量。 |
|
整数 |
预处理数据所用的毫秒数。 |
|
整数 |
运行算法所用的毫秒数。 |
|
整数 |
将属性添加到投影图中所用的毫秒数。 |
|
整数 |
未使用。 |
|
映射 |
用于运行算法的配置。 |
示例
以下所有示例都应在空数据库中运行。 这些示例使用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
上运行随机游走算法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
上运行随机游走算法,并指定sourceNodesMATCH (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"] |
统计
myGraph
上运行随机游走统计CALL gds.randomWalk.stats(
'myGraph',
{
walkLength: 3,
walksPerNode: 1,
randomSeed: 42,
concurrency: 1
}
)
preProcessingMillis | computeMillis | configuration |
---|---|---|
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} |
变异
myGraph
上运行随机游走变异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" |
然后我们可以流式传输变异的节点属性,以查看它出现在多少个随机游走中
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 |