pgr_lineGraph - Proposed - pgRouting Manual (3.8)
pgr_lineGraph
- Proposed
pgr_lineGraph
- Transforms the given graph into its corresponding edge-based
graph.
Warning
Proposed functions for next mayor release.
-
They are not officially in the current release.
-
They will likely officially be part of the next mayor release:
-
The functions make use of ANY-INTEGER and ANY-NUMERICAL
-
Name might not change. (But still can)
-
Signature might not change. (But still can)
-
Functionality might not change. (But still can)
-
pgTap tests have being done. But might need more.
-
Documentation might need refinement.
-
Availability
-
Version 3.7.0
-
Function promoted to proposed.
-
Works for directed and undirected graphs.
-
-
Version 2.5.0
-
New experimental function.
-
Description
Given a graph \(G\) , its line graph \(L(G)\) is a graph such that:
-
Each vertex of \(L(G)\) represents an edge of \(G\) .
-
Two vertices of \(L(G)\) are adjacent if and only if their corresponding edges share a common endpoint in \(G\)
The main characteristics are:
-
Works for directed and undirected graphs.
-
The
costandreverse_costcolumns of the result represent existence of the edge. -
When the graph is directed the result is directed.
-
To get the complete Line Graph use unique identifiers on the double way edges (See Additional Examples ).
-
-
When the graph is undirected the result is undirected.
-
The
reverse_costis always \(-1\) .
-
Signatures
directed
])
(seq,
source,
target,
cost,
reverse_cost)
- Example :
-
For an undirected graph with edges :math:’{2,4,5,8}’
SELECT * FROM pgr_lineGraph(
'SELECT id, source, target, cost, reverse_cost
FROM edges WHERE id IN (2,4,5,8)',
false);
seq source target cost reverse_cost
-----+--------+--------+------+--------------
1 2 4 1 -1
2 2 5 1 -1
3 4 8 1 -1
4 5 8 1 -1
(4 rows)
Parameters
|
Parameter |
Type |
Description |
|---|---|---|
|
|
Edges SQL as described below. |
Optional parameters
|
Column |
Type |
Default |
Description |
|---|---|---|---|
|
|
|
|
|
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,
source,
target,
cost,
reverse_cost)
|
Column |
Type |
Description |
|---|---|---|
|
|
|
Sequential value starting from 1 .
|
|
|
|
Identifier of the source vertex of the current edge.
|
|
|
|
Identifier of the target vertex of the current edge.
|
|
|
|
Weight of the edge (
|
|
|
|
Weight of the edge (
|
Additional Examples
Given the following directed graph
\(G(V,E) = G(\{1,2,3,4\},\{ 1 \rightarrow 2, 1 \rightarrow 4, 2 \rightarrow 3, 3 \rightarrow 1, 3 \rightarrow 2, 3 \rightarrow 4, 4 \rightarrow 3\})\)
Representation as directed with unique edge identifiers
For the simplicity, the design of the edges table on the database, has the edge’s identifiers are represented with 3 digits:
- hundreds :
-
the source vertex
- tens :
-
always 0, acts as a separator
- units :
-
the target vertex
In this image,
-
Single head arrows represent one edge (row) on the edges table.
-
There are no double head arrows
-
The numbers in the yellow shadow are the edge identifiers.
Two pair of edges share the same ending nodes and the
reverse_cost
column is
not used.
-
Edges \({2 \rightarrow 3, 3 \rightarrow 2}\) are represented with two edges \(id=203\) and \(id=302\) respectively.
-
Edges \({3 \rightarrow 4, 4 \rightarrow 3}\) are represented with two edges \(id=304\) and \(id=403\) respectively.
The graph can be created as follows:
CREATE TABLE edges_unique (
id BIGINT,
source BIGINT,
target BIGINT,
cost FLOAT,
geom geometry
);
CREATE TABLE
INSERT INTO edges_unique (id, source, target, cost, geom) VALUES
(102, 1, 2, 1, ST_MakeLine(ST_POINT(0, 2), ST_POINT(2, 2))),
(104, 1, 4, 1, ST_MakeLine(ST_POINT(0, 2), ST_POINT(0, 0))),
(301, 3, 1, 1, ST_MakeLine(ST_POINT(2, 0), ST_POINT(0, 2))),
(203, 2, 3, 1, ST_MakeLine(ST_POINT(2, 2), ST_POINT(2, 0))),
(304, 3, 4, 1, ST_MakeLine(ST_POINT(2, 0), ST_POINT(0, 0))),
(302, 3, 2, 1, ST_MakeLine(ST_POINT(2, 0), ST_POINT(2, 2))),
(403, 4, 3, 1, ST_MakeLine(ST_POINT(0, 0), ST_POINT(2, 0)));
Line Graph of a directed graph represented with unique edges
SELECT seq, source, target, cost, reverse_cost
FROM pgr_lineGraph(
'SELECT id, source, target, cost FROM edges_unique',
true);
seq source target cost reverse_cost
-----+--------+--------+------+--------------
1 102 203 1 -1
2 104 403 1 -1
3 203 301 1 -1
4 203 304 1 -1
5 301 102 1 -1
6 301 104 1 -1
7 302 203 1 1
8 304 403 1 1
9 403 301 1 -1
10 403 302 1 -1
(10 rows)
-
The result is a directed graph.
-
For \(seq=7\) from \(203 \leftrightarrow 302\) represent two edges.
-
For \(seq=8\) from \(304 \leftrightarrow 403\) represent two edges.
-
For all the other values of
seqrepresent one edge. -
The
costandreverse_costvalues represent the existence of the edge.-
When positive: the edge exists.
-
When negative: the edge does not exist.
-
See Also
-
wikipedia: Line Graph
-
mathworld: Line Graph
Indices and tables