ST_ShortestPathLength
Signatures
-- Input type:
-- TABLE[EDGE_ID, START_NODE, END_NODE[, w][, eo]]
-- Return type:
-- TABLE[SOURCE, DESTINATION, DISTANCE]
ST_ShortestPathLength('INPUT_EDGES', 'o[ - eo]'[, 'w'],
s, d); -- One-to-One
ST_ShortestPathLength('INPUT_EDGES', 'o[ - eo]'[, 'w'],
s, 'ds'); -- One-to-Several
ST_ShortestPathLength('INPUT_EDGES', 'o[ - eo]'[, 'w'],
s); -- One-to-All
ST_ShortestPathLength('INPUT_EDGES', 'o[ - eo]'[, 'w'],
'SDT'); -- Many-to-Many
Description
Calculates the length(s) of shortest path(s) among vertices in a
graph. Can be used to calculate distance matrices.
Variable
Meaning
INPUT_EDGES
Table containing integer columns EDGE_ID
, START_NODE
and END_NODE
; and optionally a weight column w
(if the graph is weighted) and/or an edge orientation column eo
(required if global orientation is not undirected
)
o
Global orientation string: directed
, reversed
or undirected
eo
Edge orientation column name indicating individual edge orientations: 1
(directed), -1
(reversed) or 0
(undirected); required if global orientation is directed
or reversed
w
Edge weights column name
s
Source vertex id
d
Destination vertex id
ds
Comma-separated destination string: 'dest1, dest2, ...'
SDT
Source-Destination table name; must contain columns SOURCE
and DESTINATION
containing integer vertex ids
Examples
-- Prepare example data. We give an illustration of the graph this
-- represents below. In order to visualize how these distances are
-- calculated, please see the documentation of ST_ShortestPath and
-- ST_ShortestPathTree.
CREATE TABLE EDGES(EDGE_ID INT AUTO_INCREMENT PRIMARY KEY,
START_NODE INT,
END_NODE INT,
WEIGHT DOUBLE,
EDGE_ORIENTATION INT);
INSERT INTO EDGES VALUES
(DEFAULT, 1, 2, 10.0, 1),
(DEFAULT, 2, 4, 1.0, -1),
(DEFAULT, 2, 3, 2.0, 1),
(DEFAULT, 3, 2, 3.0, 1),
(DEFAULT, 1, 3, 5.0, 1),
(DEFAULT, 3, 4, 9.0, 1),
(DEFAULT, 3, 5, 2.0, 1),
(DEFAULT, 4, 5, 4.0, 1),
(DEFAULT, 5, 4, 6.0, 1),
(DEFAULT, 5, 1, 7.0, 0),
(DEFAULT, 6, 7, 1.0, 1),
(DEFAULT, 7, 8, 2.0, 1);
One-to-One
SELECT * FROM
ST_ShortestPathLength('EDGES',
'directed - EDGE_ORIENTATION',
'WEIGHT', 1, 5);
-- | SOURCE | DESTINATION | DISTANCE |
-- |--------|-------------|----------|
-- | 1 | 5 | 7.0 |
-- We can obtain just the distance if we want:
SELECT DISTANCE FROM
ST_ShortestPathLength('EDGES',
'directed - EDGE_ORIENTATION',
'WEIGHT', 1, 5);
-- | DISTANCE |
-- |----------|
-- | 7.0 |
-- In an unweighted graph, d(1, 5) is just the number of steps from
-- vertex 1 to vertex 5. They are connected by edge -10.
SELECT * FROM
ST_ShortestPathLength('EDGES',
'directed - EDGE_ORIENTATION',
1, 5);
-- | SOURCE | DESTINATION | DISTANCE |
-- |--------|-------------|----------|
-- | 1 | 5 | 1.0 |
-- The distance function is not necessarily symmetric in directed
-- graphs: d(a, b) != d(b, a)
SELECT (SELECT DISTANCE FROM
ST_ShortestPathLength('EDGES',
'directed - EDGE_ORIENTATION',
'WEIGHT', 1, 3)) DIST_1_3,
(SELECT DISTANCE FROM
ST_ShortestPathLength('EDGES',
'directed - EDGE_ORIENTATION',
'WEIGHT', 3, 1)) DIST_3_1;
-- | DIST_1_3 | DIST_3_1 |
-- |----------|----------|
-- | 5.0 | 9.0 |
-- However, it is symmetric in undirected graphs:
SELECT (SELECT DISTANCE FROM
ST_ShortestPathLength('EDGES',
'undirected',
'WEIGHT', 1, 3)) DIST_1_3,
(SELECT DISTANCE FROM
ST_ShortestPathLength('EDGES',
'undirected',
'WEIGHT', 3, 1)) DIST_3_1;
-- | DIST_1_3 | DIST_3_1 |
-- |----------|----------|
-- | 5.0 | 5.0 |
-- Vertex 6 is not reachable from vertex 1.
SELECT * FROM
ST_ShortestPathLength('EDGES',
'directed - EDGE_ORIENTATION',
'WEIGHT', 1, 6);
-- | SOURCE | DESTINATION | DISTANCE |
-- |--------|-------------|----------|
-- | 1 | 6 | Infinity |
One-to-Several
-- Here we calculate d(1, 3), d(1, 5) and d(1, 6) in a single
-- request. Since vertex 6 is not reachable from vertex 1, it is not
-- returned in the list.
SELECT * FROM
ST_ShortestPathLength('EDGES',
'directed - EDGE_ORIENTATION',
'WEIGHT', 1, '3, 5, 6');
-- | SOURCE | DESTINATION | DISTANCE |
-- |--------|-------------|----------|
-- | 1 | 3 | 5.0 |
-- | 1 | 5 | 7.0 |
One-to-All
-- Here we calculate d(1, *), i.e., the distance from vertex 1 to
-- all reachable vertices. Notice that vertices 6, 7 and 8 are not
-- reachable from vertex 1, so they do not show up in the list.
SELECT * FROM
ST_ShortestPathLength('EDGES',
'directed - EDGE_ORIENTATION',
'WEIGHT', 1);
-- | SOURCE | DESTINATION | DISTANCE |
-- |--------|-------------|----------|
-- | 1 | 4 | 13.0 |
-- | 1 | 3 | 5.0 |
-- | 1 | 2 | 8.0 |
-- | 1 | 5 | 7.0 |
-- | 1 | 1 | 0.0 |
-- The only vertices reachable from vertex 6 are vertices 6, 7 and
-- 8.
SELECT * FROM
ST_ShortestPathLength('EDGES',
'directed - EDGE_ORIENTATION',
'WEIGHT', 6);
-- | SOURCE | DESTINATION | DISTANCE |
-- |--------|-------------|----------|
-- | 6 | 7 | 1.0 |
-- | 6 | 8 | 3.0 |
-- | 6 | 6 | 0.0 |
Many-to-Many (distance matrices)
-- Create a source-destination table:
CREATE TABLE SDT(SOURCE INT,
DESTINATION INT) AS
SELECT A.X, B.X
FROM SYSTEM_RANGE(1, 8) A,
SYSTEM_RANGE(1, 8) B;
-- Only vertices reachable from each source are returned.
SELECT * FROM
ST_ShortestPathLength('EDGES',
'directed - EDGE_ORIENTATION',
'WEIGHT', 'SDT')
ORDER BY SOURCE, DESTINATION ASC;
-- | SOURCE | DESTINATION | DISTANCE |
-- |--------|-------------|----------|
-- | 1 | 1 | 0.0 |
-- | 1 | 2 | 8.0 |
-- | 1 | 3 | 5.0 |
-- | 1 | 4 | 13.0 |
-- | 1 | 5 | 7.0 |
-- | 2 | 1 | 11.0 |
-- | 2 | 2 | 0.0 |
-- | 2 | 3 | 2.0 |
-- | 2 | 4 | 10.0 |
-- | 2 | 5 | 4.0 |
-- | 3 | 1 | 9.0 |
-- | 3 | 2 | 3.0 |
-- | 3 | 3 | 0.0 |
-- | 3 | 4 | 8.0 |
-- | 3 | 5 | 2.0 |
-- | 4 | 1 | 11.0 |
-- | 4 | 2 | 1.0 |
-- | 4 | 3 | 3.0 |
-- | 4 | 4 | 0.0 |
-- | 4 | 5 | 4.0 |
-- | 5 | 1 | 7.0 |
-- | 5 | 2 | 7.0 |
-- | 5 | 3 | 9.0 |
-- | 5 | 4 | 6.0 |
-- | 5 | 5 | 0.0 |
-- | 6 | 6 | 0.0 |
-- | 6 | 7 | 1.0 |
-- | 6 | 8 | 3.0 |
-- | 7 | 7 | 0.0 |
-- | 7 | 8 | 2.0 |
-- | 8 | 8 | 0.0 |
-- The following example shows that the distance matrix D' of a graph
-- G' whose edges are obtained from a graph G by reversing the
-- orientation of every edge is the transpose of the distance matric D
-- of G: D' = D_transpose.
SELECT * FROM
ST_ShortestPathLength('EDGES',
'reversed - EDGE_ORIENTATION',
'WEIGHT', 'SDT')
ORDER BY DESTINATION, SOURCE ASC;
-- | SOURCE | DESTINATION | DISTANCE |
-- |--------|-------------|----------|
-- | 1 | 1 | 0.0 |
-- | 2 | 1 | 8.0 |
-- | 3 | 1 | 5.0 |
-- | 4 | 1 | 13.0 |
-- | 5 | 1 | 7.0 |
-- | 1 | 2 | 11.0 |
-- | 2 | 2 | 0.0 |
-- | 3 | 2 | 2.0 |
-- | 4 | 2 | 10.0 |
-- | 5 | 2 | 4.0 |
-- | 1 | 3 | 9.0 |
-- | 2 | 3 | 3.0 |
-- | 3 | 3 | 0.0 |
-- | 4 | 3 | 8.0 |
-- | 5 | 3 | 2.0 |
-- | 1 | 4 | 11.0 |
-- | 2 | 4 | 1.0 |
-- | 3 | 4 | 3.0 |
-- | 4 | 4 | 0.0 |
-- | 5 | 4 | 4.0 |
-- | 1 | 5 | 7.0 |
-- | 2 | 5 | 7.0 |
-- | 3 | 5 | 9.0 |
-- | 4 | 5 | 6.0 |
-- | 5 | 5 | 0.0 |
-- | 6 | 6 | 0.0 |
-- | 7 | 6 | 1.0 |
-- | 8 | 6 | 3.0 |
-- | 7 | 7 | 0.0 |
-- | 8 | 7 | 2.0 |
-- | 8 | 8 | 0.0 |
See also