我正在尝试在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)之外,此问题是否有解决方案?
答案 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数据表。