pgr_degree
-- 拟议¶
pgr_degree
—对于无向图中的每个顶点,返回与该顶点关联的边的计数。
Warning
下一版本的拟议功能。
它们并未正式出现在当前版本中。
它们可能会正式成为下一个版本的一部分:
这些函数使用 ANY-INTEGER 和 ANY-NUMERICAL
名字可能不会改变。(但仍然有可能改变)
签名可能不会改变。(但仍然有可能改变)
功能可能不会改变。(但仍然有可能改变)
pgTap 测试已经完成。 但可能需要更多。
文档可能需要完善。
可用性
版本 3.4.0
新 拟议 函数
描述¶
计算 无向 图顶点的度数
签名¶
(node, degree)
- 示例:
提取顶点信息
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 如下所述 |
|
|
Vertex SQL 如下所述 |
可选参数¶
参数 |
类型 |
默认 |
描述 |
---|---|---|---|
|
|
|
|
内部查询¶
Edges SQL¶
列 |
类型 |
描述 |
---|---|---|
|
|
边的标识符。 |
Vertex SQL¶
列 |
类型 |
描述 |
---|---|---|
|
|
边的第一个端点顶点的标识符。 |
|
|
以顶点
|
|
|
以顶点
|
结果列¶
列 |
类型 |
描述 |
---|---|---|
|
|
顶点标识符 |
|
|
与顶点 |
其他示例¶
子图的度数¶
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_edges
和 out_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)
例如,当应用程序考虑减速带、停止信号时,此信息是正确的。
当线性边较多时,为了加快速度,可以使用 收缩 - 函数族 函数来划分问题。
另请参阅¶
索引和表格