随机生成

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

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

目前无法将这些生成的图持久化到 Neo4j 数据库中。在生成的图上以写入模式运行算法会导致不可预期的结果。

图生成由三个维度参数化:

  • 节点计数(node count)- 生成图中的节点数量

  • 平均度数(average degree)- 描述生成节点的平均出度

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

语法

以下描述了运行图生成过程的 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

生成节点的平均出度。

配置

Map

{}

附加配置,见下文。

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

relationshipDistribution

字符串

UNIFORM

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

relationshipSeed

整数

null

用于生成关系的种子。

relationshipProperty

Map

{}

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

aggregation

字符串

NONE

关系聚合方法,参考 关系投影

方向 (orientation)

字符串

NATURAL

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

allowSelfLoops

布尔值

false

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

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

表 3. 结果
名称 类型 描述

名称 (name)

字符串

存储生成的图所用的名称。

节点

整数

图中的节点数。

relationships

整数

图中的关系总数。

generateMillis

整数

生成图所需的毫秒数。

relationshipSeed

整数

用于生成关系的种子。

averageDegree

浮点数

生成节点的平均出度。

relationshipDistribution

字符串

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

relationshipProperty

字符串

生成的关系属性配置。

关系分布

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

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

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

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

关系属性

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

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

名称 (name)

字符串

null

存储属性值的名称。

type

字符串

null

用于生成属性值的方法。

min

浮点数

0.0

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

最大值

浮点数

1.0

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

浮点数

null

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

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

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

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

关系种子

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

示例

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

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

生成无权图

以下内容将生成一个具有无权关系的图:
CALL gds.graph.generate('graph',5,2, {relationshipSeed:19})
YIELD name, nodes, relationships, relationshipDistribution
表 5. 结果
名称 (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
表 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. 结果
名称 (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
表 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 创建的,但它们的拓扑结构是相同的。