pgr_transitiveClosure - Experimental - pgRouting Manual (3.2)
pgr_transitiveClosure - Experimental
   
    
     pgr_transitiveClosure
    
   
   - Returns the transitive closure graph of the input graph.
In particular, the transitive closure algorithm implemented by Boost.Graph.
  
   
   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 transitive_closure() function transforms the input graph g into the transitive closure graph tc.
This implementation can only be used with a directed graph with no cycles i.e. directed acyclic graph.
- The main characteristics are:
 - 
     
- 
       
Process is valid for directed acyclic graphs only. otherwise it will throw warnings.
 - 
       
The returned values are not ordered:
 
- 
       
Running time: \(O(VE)\)
 
 - 
       
 
Signatures
Summary
The pgr_transitiveClosure function has the following signature:
pgr_transitiveClosure(Edges SQL)
RETURNS SETOF (id, vid, target_array)
    - Example :
 - 
     
Complete Graph of 3 vertexs
 
SELECT * FROM pgr_transitiveclosure(
  'SELECT id,source,target,cost,reverse_cost FROM edge_table1'
);
 seq  vid  target_array
-----+-----+--------------
   1    0  {1,3,2}
   2    1  {3,2}
   3    3  {2}
   4    2  {}
(4 rows)
    Parameters
| 
        Column  | 
      
        Type  | 
      
        Description  | 
     
|---|---|---|
| 
        Edges SQL  | 
      
        
          | 
      
        SQL query as described in Inner query  | 
     
Inner query
| 
        Column  | 
      
        Type  | 
      
        Default  | 
      
        Description  | 
     
|---|---|---|---|
| 
        id  | 
      
        
          | 
      
        Identifier of the edge.  | 
     |
| 
        source  | 
      
        
          | 
      
        Identifier of the first end point vertex of the edge.  | 
     |
| 
        target  | 
      
        
          | 
      
        Identifier of the second end point vertex of the edge.  | 
     |
| 
        cost  | 
      
        
          | 
      
        Weight of the edge (source, target) 
  | 
     |
| 
        reverse_cost  | 
      
        
          | 
      
        -1  | 
      
        Weight of the edge (target, source) , 
  | 
     
Where:
- ANY-INTEGER :
 - 
     
SMALLINT, INTEGER, BIGINT
 - ANY-NUMERICAL :
 - 
     
SMALLINT, INTEGER, BIGINT, REAL, FLOAT
 
Result Columns
RETURNS SETOF (seq, vid, target_array)
The function returns a single row. The columns of the row are:
| 
        Column  | 
      
        Type  | 
      
        Description  | 
     
|---|---|---|
| 
        seq  | 
      
        
          | 
      
        Sequential value starting from 1 .  | 
     
| 
        vid  | 
      
        
          | 
      
        Identifier of the vertex.  | 
     
| 
        target_array  | 
      
        
          | 
      
        Array of identifiers of the vertices that are reachable from vertex v.  | 
     
Additional Examples
- Example :
 - 
     
Some sub graphs of the sample data
 
SELECT * FROM pgr_transitiveclosure(
  'SELECT id,source,target,cost,reverse_cost FROM edge_table where id=2'
);
 seq  vid  target_array
-----+-----+--------------
   1    2  {}
   2    3  {2}
(2 rows)
SELECT * FROM pgr_transitiveclosure(
  'SELECT id,source,target,cost,reverse_cost FROM edge_table where id=3'
);
 seq  vid  target_array
-----+-----+--------------
   1    3  {}
   2    4  {3}
(2 rows)
SELECT * FROM pgr_transitiveclosure(
  'SELECT id,source,target,cost,reverse_cost FROM edge_table where id=2 or id=3'
);
 seq  vid  target_array
-----+-----+--------------
   1    2  {}
   2    3  {2}
   3    4  {3,2}
(3 rows)
SELECT * FROM pgr_transitiveclosure(
  'SELECT id,source,target,cost,reverse_cost FROM edge_table where id=11'
);
 seq  vid  target_array
-----+-----+--------------
   1    6  {11}
   2   11  {}
(2 rows)
-- q3
SELECT * FROM pgr_transitiveclosure(
  'SELECT id,source,target,cost,reverse_cost FROM edge_table where cost=-1 or reverse_cost=-1'
);
 seq  vid  target_array
-----+-----+---------------
   1    2  {}
   2    3  {11,12,6,2}
   3    4  {11,12,3,6,2}
   4    6  {11,12}
   5   11  {12}
   6   10  {11,12}
   7   12  {}
(7 rows)
    See Also
- 
     
The queries use the Sample Data network.
 
Indices and tables