pgr_degree -- 拟议

pgr_degree —对于无向图中的每个顶点,返回与该顶点关联的边的计数。

Warning

下一版本的拟议功能。

  • 它们并未正式出现在当前版本中。

  • 它们可能会正式成为下一个版本的一部分:

    • 这些函数使用 ANY-INTEGER 和 ANY-NUMERICAL

    • 名字可能不会改变。(但仍然有可能改变)

    • 签名可能不会改变。(但仍然有可能改变)

    • 功能可能不会改变。(但仍然有可能改变)

    • pgTap 测试已经完成。 但可能需要更多。

    • 文档可能需要完善。

可用性

  • 版本 3.4.0

    • 拟议 函数

描述

计算 无向 图顶点的度数

签名

pgr_degree(Edges SQL , Vertex SQL, [dryrun])
RETURNS SETOF (node, degree)
OR EMTPY SET
示例:

提取顶点信息

pgr_degree`可以利用 `pgr_extractVertices 的输出,或者可以在调用中嵌入`pgr_extractVertices`。对于较大规模的网络,最好提前准备好顶点表并在`pgr_degree`调用中使用该顶点表。

DROP TABLE IF EXISTS tmp_edges_vertices_pgr;
NOTICE:  table "tmp_edges_vertices_pgr" does not exist, skipping
DROP TABLE
CREATE TEMP TABLE tmp_edges_vertices_pgr AS
SELECT id, in_edges, out_edges
    FROM pgr_extractVertices('SELECT id, geom FROM edges');
SELECT 17
SELECT * FROM pgr_degree(
  $$SELECT id FROM edges$$,
  $$SELECT id, in_edges, out_edges
    FROM tmp_edges_vertices_pgr$$);
 node | degree
------+--------
    1 |      1
    2 |      1
    3 |      2
    4 |      1
    5 |      1
    6 |      3
    7 |      4
    8 |      3
    9 |      1
   10 |      3
   11 |      4
   12 |      3
   13 |      1
   14 |      1
   15 |      2
   16 |      3
   17 |      2
(17 rows)

参数

参数

类型

描述

Edges SQL

TEXT

Edges SQL 如下所述

Vertex SQL

TEXT

Vertex SQL 如下所述

可选参数

参数

类型

默认

描述

dryrun

BOOLEAN

false

  • 当为真时,不要处理查询,而是获取一个通知(NOTICE)来显示查询的结果。

内部查询

Edges SQL

类型

描述

id

BIGINT

边的标识符。

Vertex SQL

类型

描述

id

BIGINT

边的第一个端点顶点的标识符。

in_edges

BIGINT[]

以顶点 id 作为*第一个端点*的边的标识符数组。

  • 当缺失时, out_edges 必须存在。

out_edges

BIGINT[]

以顶点 id 作为*第二个端点*的边的标识符数组。

  • 缺失时, in_edges 必须存在。

结果列

类型

描述

node

BIGINT

顶点标识符

degree

BIGINT

与顶点 id 关联的边数

其他示例

子图的度数

SELECT * FROM pgr_degree(
  $$SELECT id FROM edges WHERE id < 17$$,
  $$SELECT id, in_edges, out_edges
    FROM pgr_extractVertices('SELECT id, geom FROM edges')$$);
 node | degree
------+--------
    1 |      1
    2 |      0
    3 |      2
    4 |      0
    5 |      1
    6 |      3
    7 |      4
    8 |      3
    9 |      1
   10 |      3
   11 |      4
   12 |      3
   13 |      0
   14 |      0
   15 |      2
   16 |      3
   17 |      2
(17 rows)

模拟执行

要获取用于生成顶点信息的查询,请使用 dryrun => true

结果可作为基础代码,根据后台开发需要进行改进。

SELECT * FROM pgr_degree(
  $$SELECT id FROM edges WHERE id < 17$$,
  $$SELECT id, in_edges, out_edges
    FROM pgr_extractVertices('SELECT id, geom FROM edges')$$,
  dryrun => true);
NOTICE:
    WITH

    -- a sub set of edges of the graph goes here
    g_edges AS (
      SELECT id FROM edges WHERE id < 17
    ),

    -- sub set of vertices of the graph goes here
    all_vertices AS (
      SELECT id, in_edges, out_edges
    FROM pgr_extractVertices('SELECT id, geom FROM edges')
    ),

    g_vertices AS (
      SELECT id,
        unnest(
          coalesce(in_edges::BIGINT[], '{}'::BIGINT[])
          ||
          coalesce(out_edges::BIGINT[], '{}'::BIGINT[])) AS eid
      FROM all_vertices
    ),

    totals AS (
      SELECT v.id, count(*)
      FROM g_vertices AS v
      JOIN g_edges AS e ON (e.id = eid) GROUP BY v.id
    )

    SELECT id::BIGINT, coalesce(count, 0)::BIGINT FROM all_vertices LEFT JOIN totals USING (id)
    ;
 node | degree
------+--------
(0 rows)

来自现有表的度数

如果您已经使用 pgr_extractVertices 构建了一个顶点表,并且想要整个图的度而不是子集,则可以放弃使用 pgr_degree 并直接使用 in_edgesout_edges 列。

死端

获取死端:

SELECT id FROM vertices
WHERE array_length(in_edges || out_edges, 1) = 1;
 id
----
  1
  5
  9
 13
 14
  2
  4
(7 rows)

例如,当死端位于导入图的极限时,该信息是正确的。

从视觉上看,节点 \(4\) 看起来是 3 条边的开始/结束,但事实并非如此。

那是对的吗?

  • 有这么小的路边吗:

    • 这不允许车辆使用该视觉交叉路口?

    • 是否适用于行人,因此行人可以轻松地在小路边行走?

    • 电力和电线的应用是否可以轻松地延伸到小路边顶部?

  • 是否有一个大悬崖,从鹰的角度看,死胡同靠近该路段?

当有很多死端时,为了加快速度,可以使用 收缩 - 函数族 函数来划分问题。

线性边

要获得线性边:

SELECT id FROM vertices
WHERE array_length(in_edges || out_edges, 1) = 2;
 id
----
  3
 15
 17
(3 rows)

例如,当应用程序考虑减速带、停止信号时,此信息是正确的。

当线性边较多时,为了加快速度,可以使用 收缩 - 函数族 函数来划分问题。

另请参阅

索引和表格