pgr_topologicalSort - Experimental - pgRouting Manual (3.4)
pgr_topologicalSort
- Experimental
pgr_topologicalSort
- Linear ordering of the vertices for directed acyclic
graphs (DAG).
Warning
Possible server crash
-
These functions might create a server crash
Warning
Experimental functions
-
They are not officially of the current release.
-
They likely will not be officially be part of the next release:
-
The functions might not make use of ANY-INTEGER and ANY-NUMERICAL
-
Name might change.
-
Signature might change.
-
Functionality might change.
-
pgTap tests might be missing.
-
Might need c/c++ coding.
-
May lack documentation.
-
Documentation if any might need to be rewritten.
-
Documentation examples might need to be automatically generated.
-
Might need a lot of feedback from the comunity.
-
Might depend on a proposed function of pgRouting
-
Might depend on a deprecated function of pgRouting
-
Availability
-
Version 3.0.0
-
New experimental function
-
Description
The topological sort algorithm creates a linear ordering of the vertices such that if edge \((u,v)\) appears in the graph, then \(v\) comes before \(u\) in the ordering.
The main characteristics are:
-
Process is valid for directed acyclic graphs only. otherwise it will throw warnings.
-
- For optimization purposes, if there are more than one answer, the function
-
will return one of them.
-
The returned values are ordered in topological order:
-
Running time: \(O(V + E)\)
Signatures
Summary
- Example :
-
Topologically sorting the graph
SELECT * FROM pgr_topologicalsort(
$$SELECT id, source, target, cost
FROM edges WHERE cost >= 0
UNION
SELECT id, target, source, reverse_cost
FROM edges WHERE cost < 0$$);
seq sorted_v
-----+----------
1 1
2 5
3 2
4 4
5 3
6 13
7 14
8 15
9 10
10 6
11 7
12 8
13 9
14 11
15 16
16 12
17 17
(17 rows)
Parameters
Parameter |
Type |
Description |
---|---|---|
|
Edges SQL as described below. |
Inner Queries
Edges SQL
Column |
Type |
Default |
Description |
---|---|---|---|
|
ANY-INTEGER |
Identifier of the edge. |
|
|
ANY-INTEGER |
Identifier of the first end point vertex of the edge. |
|
|
ANY-INTEGER |
Identifier of the second end point vertex of the edge. |
|
|
ANY-NUMERICAL |
Weight of the edge (
|
|
|
ANY-NUMERICAL |
-1 |
Weight of the edge (
|
Where:
- ANY-INTEGER :
-
SMALLINT
,INTEGER
,BIGINT
- ANY-NUMERICAL :
-
SMALLINT
,INTEGER
,BIGINT
,REAL
,FLOAT
Result Columns
Returns set of
(seq,
sorted_v)
Column |
Type |
Description |
---|---|---|
|
|
Sequential value starting from \(1\) |
|
|
Linear topological ordering of the vertices |
Additional examples
- Example :
-
Topologically sorting the one way segments
SELECT * FROM pgr_topologicalsort(
$$SELECT id, source, target, cost, -1 AS reverse_cost
FROM edges WHERE cost >= 0
UNION
SELECT id, source, target, -1, reverse_cost
FROM edges WHERE cost < 0$$);
seq sorted_v
-----+----------
1 5
2 2
3 4
4 13
5 14
6 1
7 3
8 15
9 10
10 6
11 7
12 8
13 9
14 11
15 12
16 16
17 17
(17 rows)
- Example :
-
Graph is not a DAG
SELECT * FROM pgr_topologicalsort(
$$SELECT id, source, target, cost, reverse_cost FROM edges$$);
ERROR: Graph is not DAG
CONTEXT: SQL function "pgr_topologicalsort" statement 1
See Also
Indices and tables