Oracle SQL中的无向图

时间:2014-06-03 17:02:51

标签: sql oracle graph

我正在尝试在Oracle SQL中表示无向图,例如,我有工作站图:

CREATE TABLE station (
   station_id INTEGER NOT NULL
);

CREATE TABLE station_link (
  from_station INTEGER NOT NULL,
  to_station INTEGER NOT NULL
);

这显然是有针对性的图,但我不知道,如何让它无向。

我需要获取所有顶点,这些顶点具有当前顶点的路径和有关其级别的信息(此路径上有多少个顶点)。

对于有向图,这很简单:

SELECT sl.to_station, LEVEL
  FROM station_link sl
START WITH sl.from_station = :curVertex
CONNECT BY NOCYCLE PRIOR sl.to_station = sl.from_station

但是我们只能得到单向的顶点。

问题: 除了添加其他链接(2 - > 1表示1 - > 2)之外,此问题是否有解决方案?

有测试的小提琴:http://sqlfiddle.com/#!4/6c09e/24

1 个答案:

答案 0 :(得分:0)

对于“快速获胜”,您可以“按原样”使用您的结构,但是对于每个边缘,您在station_link表中都有两条记录。

如果你想要“not_so_fast_but_without_doble_edge_records_please win”,你可以使用这个怪异的技巧:

SELECT
  x.TO_STATION,
  x.LVL
FROM (
        SELECT sl.to_station, LEVEL as lvl
          FROM station_link sl
        START WITH sl.from_station = :curVertex 
        CONNECT BY NOCYCLE PRIOR sl.to_station = sl.from_station 
        UNION ALL
        SELECT sl.from_station as to_station , LEVEL as lvl
          FROM station_link sl
        START WITH sl.to_station = :curVertex 
        CONNECT BY NOCYCLE PRIOR sl.from_station = sl.to_station
) x

它将完成工作。实际上,它只是结合了两个遍历方向。

但如果我想在PLSQL中的图形上实现一些严肃的算法,我会关注SDO_GEOMETRY数据类型和Oracle Spatial And Graphs数据表。