随机生成

在某些用例中,生成随机图很有用,例如用于测试或基准测试。因此,Neo4j 图算法库提供了一组内置的图生成器。生成器将生成的图存储在图目录中。该图可以用作库中任何算法的输入。

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

目前无法将这些图持久化到 Neo4j 中。在生成的图上以写入模式运行算法将导致意外结果。

图生成由三个维度参数化

  • 节点计数 - 生成图中节点的数量

  • 平均度数 - 描述生成节点的平均出度

  • 关系分布函数 - 用于连接生成节点的概率分布方法

语法

以下描述了运行图生成过程的 API
CALL gds.graph.generate(
    graphName: String,
    nodeCount: Integer,
    averageDegree: Integer,
    configuration: Map
})
YIELD name, nodes, relationships, generateMillis, relationshipSeed, averageDegree, relationshipDistribution, relationshipProperty
表 1. 参数
名称 类型 默认值 可选 描述

graphName

字符串

null

存储生成的图的名称。

nodeCount

整数

null

生成的节点数量。

averageDegree

整数

null

生成节点的平均出度。

configuration

映射

{}

额外配置,见下文。

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

relationshipDistribution

字符串

UNIFORM

用于连接生成节点的概率分布方法。更多信息请参见关系分布

relationshipSeed

整数

null

用于生成关系的种子。

relationshipProperty

映射

{}

描述用于生成关系属性的方法。默认情况下不生成关系属性。更多信息请参见关系属性

aggregation

字符串

NONE

关系聚合方法参见关系投影

orientation

字符串

NATURAL

边方向的方法。允许的值为 NATURAL、REVERSE 和 UNDIRECTED。

allowSelfLoops

布尔值

false

是否允许源节点和目标节点相同的关系。

表 3. 结果
名称 类型 描述

名称

字符串

存储图的名称。

nodes

整数

图中的节点数量。

relationships

整数

图中的关系数量。

generateMillis

整数

生成图的毫秒数。

relationshipSeed

整数

用于生成关系的种子。

averageDegree

浮点数

生成节点的平均出度。

relationshipDistribution

字符串

用于连接生成节点的概率分布方法。

relationshipProperty

字符串

生成的节点属性的配置。

关系分布

relationshipDistribution 参数控制用于生成新关系的统计方法。目前支持三种方法

  • UNIFORM - 均匀分布出站关系,即每个节点具有完全相同的出度(等于平均度数)。目标节点是随机选择的。

  • RANDOM - 使用正态分布分布出站关系,平均值为 averageDegree,标准差为 2 * averageDegree。目标节点是随机选择的。

  • POWER_LAW - 使用幂律分布分布入站关系。出度基于正态分布。

关系属性

图生成器能够生成关系属性。这可以通过 relationshipProperty 参数控制,该参数接受以下参数

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

名称

字符串

null

存储属性值的名称。

type

字符串

null

用于生成属性值的方法。

min

浮点数

0.0

生成属性的最小值(仅支持 RANDOM)。

max

浮点数

1.0

生成属性的最大值(仅支持 RANDOM)。

value

浮点数

null

分配给每个关系的固定值(仅支持 FIXED)。

目前,支持两种生成关系属性的方法

  • FIXED - 为每个关系分配一个固定值。必须设置 value 参数。

  • RANDOM - 在下限 (min) 和上限 (max) 之间分配一个随机值。

关系种子

relationshipSeed 参数允许用户手动指定用于生成随机图的种子。指定后,无论生成的图是有权重的还是无权重的,过程都将在节点之间生成相同的关系。这有助于检查算法在权重条件下的行为或性能。

示例

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

下面我们将演示随机图生成过程的用法。

生成无权重图

以下将生成一个无权重关系的图
CALL gds.graph.generate('graph',5,2, {relationshipSeed:19})
YIELD name, nodes, relationships, relationshipDistribution
表 5. 结果
名称 nodes 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
表 6. 结果
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
表 7. 结果
名称 nodes relationships relationshipDistribution

"weightedGraph"

5

10

"UNIFORM"

生成的图 weightedGraph 具有一个名为 score 的属性,其中包含每个关系介于 5.0 和 10.0 之间的随机值。我们可以使用 gds.graph.relationshipProperty.stream 流式传输图的关系及其分数(score)值。

以下将显示生成的关系
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
表 8. 结果
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

请注意,尽管 graphweightedGraph 是用相同的 seed 创建的,但它们的关系拓扑是等效的。

© . All rights reserved.