Finding the paths in a directed cyclic graph
Before trying the code in this section, make sure that you have created the "edges" table (see cr-edges.sql
) and installed all the code shown in the section Common code for traversing all kinds of graph.
First, define a suitable constraint on the "edges" table for representing a directed cyclic graph and populate the table with the data that represents the graph shown in the Directed cyclic graph section.
delete from edges;
alter table edges drop constraint if exists edges_chk cascade;
alter table edges add constraint edges_chk check(node_1 <> node_2);
insert into edges(node_1, node_2) values
('n2', 'n1'),
('n2', 'n4'),
('n4', 'n5'),
('n4', 'n6'),
('n6', 'n4'),
('n5', 'n6'),
('n5', 'n3'),
('n3', 'n2');
Now reinstate the implementation of "find_paths()" shown at cr-find-paths-with-nocycle-check.sql.
Find all the paths from "n2" and create the filtered subset of shortest paths to the distinct terminal nodes:
call find_paths(start_node => 'n2');
call restrict_to_shortest_paths('raw_paths', 'shortest_paths');
Look at the "raw_paths":
\t on
select t from list_paths('raw_paths');
\t off
This is the result:
path # cardinality path
------ ----------- ----
1 2 n2 > n1
2 2 n2 > n4
3 3 n2 > n4 > n5
4 3 n2 > n4 > n6
5 4 n2 > n4 > n5 > n3
6 4 n2 > n4 > n5 > n6
Look at the "filtered_paths":
\t on
select t from list_paths('shortest_paths');
\t off
This is the result:
path # cardinality path
------ ----------- ----
1 2 n2 > n1
2 2 n2 > n4
3 3 n2 > n4 > n5
4 3 n2 > n4 > n6
5 4 n2 > n4 > n5 > n3