随机生成

在某些用例中,生成随机图很有用,例如用于测试或基准测试目的。出于这个原因,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. 结果
名称 类型 描述

name

字符串

存储图的名称。

nodes

整数

图中节点的数量。

relationships

整数

图中关系的数量。

generateMillis

整数

生成图所用的毫秒数。

relationshipSeed

整数

用于生成关系的种子。

averageDegree

浮点数

生成的节点的平均出度。

relationshipDistribution

字符串

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

relationshipProperty

字符串

生成的关系属性的配置。

关系分布

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

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

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

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

关系属性

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

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

name

字符串

null

存储属性值的名称。

类型

字符串

null

用于生成属性值的方法。

最小值

浮点数

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 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. 结果
源节点 目标节点

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 nodes 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. 结果
源节点 目标节点 分数

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 创建的,但它们的关系拓扑结构是等价的。