これは私のために動作しますが、それはちょっと醜いです:
WITH RECURSIVE paths (n1, n2, distance) AS (
SELECT
nodes.n1,
nodes.n2,
1
FROM
nodes
WHERE
nodes.n1 <> nodes.n2
UNION ALL
SELECT
paths.n1,
nodes.n2,
paths.distance + 1
FROM
paths
JOIN nodes
ON
paths.n2 = nodes.n1
WHERE
nodes.n1 <> nodes.n2
)
SELECT
paths.n1,
paths.n2,
min(distance)
FROM
paths
GROUP BY
1, 2
UNION
SELECT
nodes.n1,
nodes.n2,
0
FROM
nodes
WHERE
nodes.n1 = nodes.n2
はまた、私はそれがより大きなデータセットに対して実行されますどのように良いことを確認していません。 Mark Mannの示唆しているように、代わりにグラフライブラリを使用することができます。 pygraph
。
編集:ここでグラフの構築時間を除くpygraph
from pygraph.algorithms.minmax import shortest_path
from pygraph.classes.digraph import digraph
g = digraph()
g.add_node('a')
g.add_node('b')
g.add_node('c')
g.add_node('d')
g.add_node('e')
g.add_edge(('a', 'a'))
g.add_edge(('a', 'b'))
g.add_edge(('a', 'c'))
g.add_edge(('b', 'b'))
g.add_edge(('b', 'd'))
g.add_edge(('b', 'c'))
g.add_edge(('d', 'e'))
for source in g.nodes():
tree, distances = shortest_path(g, source)
for target, distance in distances.iteritems():
if distance == 0 and not g.has_edge((source, target)):
continue
print source, target, distance
とサンプルがありますSQLのバージョンは0.5ミリ秒を要しながら、これは0.3msかかります。マークの答えに拡大
のPostgreSQL 9(http://www.postgresql.org/docs/9.0/interactive/queries-with.html)RECURSIVE WITH]は、私は、データベース内の最短経路を見つけることについてありません。 –