随机生成
在某些用例中,生成随机图非常有用,例如用于测试或基准测试。因此,Neo4j 图算法库提供了一套内置的图生成器。生成器将生成的图存储在图目录(graph catalog)中。该图可以用作库中任何算法的输入。
此功能处于 Beta 测试阶段。有关功能分级的更多信息,请参阅 API 分级。
|
目前无法将这些生成的图持久化到 Neo4j 数据库中。在生成的图上以写入模式运行算法会导致不可预期的结果。 |
图生成由三个维度参数化:
-
节点计数(node count)- 生成图中的节点数量
-
平均度数(average degree)- 描述生成节点的平均出度
-
关系分布函数(relationship distribution function)- 用于连接生成节点的概率分布方法
语法
CALL gds.graph.generate(
graphName: String,
nodeCount: Integer,
averageDegree: Integer,
configuration: Map
})
YIELD name, nodes, relationships, generateMillis, relationshipSeed, averageDegree, relationshipDistribution, relationshipProperty
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
|
字符串 |
|
否 |
存储生成图所用的名称。 |
|
整数 |
|
否 |
生成的节点数量。 |
|
整数 |
|
否 |
生成节点的平均出度。 |
|
Map |
|
是 |
附加配置,见下文。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
|
字符串 |
|
是 |
用于连接生成节点的概率分布方法。更多信息请参阅 关系分布。 |
|
整数 |
|
是 |
用于生成关系的种子。 |
|
Map |
|
是 |
描述用于生成关系属性的方法。默认情况下不生成关系属性。更多信息请参阅 关系属性。 |
|
字符串 |
|
是 |
关系聚合方法,参考 关系投影。 |
|
字符串 |
|
是 |
边的方向方法。允许的值为 NATURAL、REVERSE 和 UNDIRECTED。 |
|
布尔值 |
|
是 |
是否允许源节点和目标节点相同的关系。 |
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
| 名称 | 类型 | 描述 |
|---|---|---|
|
字符串 |
存储生成的图所用的名称。 |
|
整数 |
图中的节点数。 |
|
整数 |
图中的关系总数。 |
|
整数 |
生成图所需的毫秒数。 |
|
整数 |
用于生成关系的种子。 |
|
浮点数 |
生成节点的平均出度。 |
|
字符串 |
用于连接生成节点的概率分布方法。 |
|
字符串 |
生成的关系属性配置。 |
关系分布
relationshipDistribution 参数控制用于生成新关系的统计方法。目前支持三种方法:
-
UNIFORM- 均匀分布出度关系,即每个节点具有完全相同的出度(等于平均度数)。目标节点是随机选择的。 -
RANDOM- 使用正态分布分配出度关系,平均值为averageDegree,标准差为2 * averageDegree。目标节点是随机选择的。 -
POWER_LAW- 使用幂律分布分配入度关系。出度基于正态分布。
关系属性
图生成器能够生成关系属性。这可以通过 relationshipProperty 参数进行控制,该参数接受以下参数:
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
|
字符串 |
null |
否 |
存储属性值的名称。 |
|
字符串 |
null |
否 |
用于生成属性值的方法。 |
|
浮点数 |
0.0 |
是 |
生成属性的最小值(仅由 |
|
浮点数 |
1.0 |
是 |
生成属性的最大值(仅由 |
|
浮点数 |
null |
是 |
分配给每个关系的固定值(仅由 |
目前,有两种支持生成关系属性的方法:
-
FIXED- 为每个关系分配固定值。必须设置value参数。 -
RANDOM- 在下界 (min) 和上界 (max) 之间分配一个随机值。
关系种子
relationshipSeed 参数允许用户手动指定用于生成随机图的种子。指定后,无论生成的图是加权还是无权,该过程都会在节点之间产生相同的关系。如果您想检查算法在加权条件下的行为或性能,这会很有帮助。
示例
|
以下所有示例应在空数据库中运行。 |
下面我们将演示随机图生成过程的用法。
生成无权图
CALL gds.graph.generate('graph',5,2, {relationshipSeed:19})
YIELD name, nodes, relationships, relationshipDistribution
| 名称 (name) | 节点 | relationships | relationshipDistribution |
|---|---|---|---|
"graph"(图) |
5 |
10 |
"UNIFORM" |
一个名为 graph 的新内存图(包含 5 个节点和 10 个关系)已被创建并添加到图目录中。我们可以使用 gds.graph.relationships 过程检查其拓扑结构。
CALL gds.graph.relationships.stream('graph')
YIELD sourceNodeId,targetNodeId
RETURN sourceNodeId as source, targetNodeId as target
ORDER BY source ASC,target ASC
| source | target(目标) |
|---|---|
0 |
1 |
0 |
2 |
1 |
0 |
1 |
4 |
2 |
1 |
2 |
4 |
3 |
0 |
3 |
1 |
4 |
0 |
4 |
3 |
生成加权图
要生成具有加权关系的图,我们必须指定 relationshipProperty 参数,如上文所述。
CALL gds.graph.generate('weightedGraph',5,2, {relationshipSeed:19,
relationshipProperty: {type: 'RANDOM', min: 5.0, max: 10.0, name: 'score'}})
YIELD name, nodes, relationships, relationshipDistribution
| 名称 (name) | 节点 | relationships | relationshipDistribution |
|---|---|---|---|
"weightedGraph" |
5 |
10 |
"UNIFORM" |
生成的图 weightedGraph 有一个名为 score 的属性,包含每个关系在 5.0 到 10.0 之间的随机值。我们可以使用 gds.graph.relationshipProperty.stream 来流式传输图的关系及其分数值。
CALL gds.graph.relationshipProperty.stream('weightedGraph','score')
YIELD sourceNodeId, targetNodeId, propertyValue
RETURN sourceNodeId as source, targetNodeId as target, propertyValue as score
ORDER BY source ASC,target ASC, score
| source | target(目标) | score |
|---|---|---|
0 |
1 |
6.791408433596591 |
0 |
2 |
8.662453313014902 |
1 |
0 |
6.258381821615686 |
1 |
4 |
9.711806397654765 |
2 |
1 |
9.469695236791349 |
2 |
4 |
6.519823445755963 |
3 |
0 |
8.747179900968224 |
3 |
1 |
7.752117836610726 |
4 |
0 |
8.614858979680758 |
4 |
3 |
5.060444167785128 |
请注意,尽管 graph 和 weightedGraph 是使用相同的 seed 创建的,但它们的拓扑结构是相同的。