0

加重有向グラフを表す sqlite テーブルがあります。列は次のとおりです。

ノード1 | ノード2 | 重み (ノード 1、ノード 2)

代わりに、次のテーブルが必要です。

ノード1 | ノード2 | 重み (ノード 1、ノード 2) | 重み (ノード 2、ノード 1)

(node2 | node1 | weight(node2,node1) | weight (node1, node2) はテーブルに存在してはなりません)

私は SQL にあまり詳しくないので、sqlite3 で元のテーブルから新しいテーブルを作成する方法がわかりませんでした。

ご協力いただきありがとうございます。

4

1 に答える 1

0

node1 と node2 はノードテーブルにリンクする整数の外部キーであり、あなたが言及したテーブルはエッジテーブルだと思いますか?

エッジ テーブルが次のようなもので作成されていると仮定します。

CREATE TABLE edges( node1 INTEGER, node2 INTEGER, weight REAL );

次のようなものはどうですか (自己アークがなく、a->b からのリンクごとに b->a からのリンクもあると仮定します):

CREATE TABLE newedges( node1 INTEGER, node2 INTEGER, weight1 REAL, weight2 REAL );

INSERT INTO newedges
    SELECT e1.node1, e1.node2, e1.weight, e2.weight
    FROM edges AS e1 INNER JOIN edges AS e2
    ON e1.node1=e2.node2 AND e1.node2=e2.node1
    WHERE e1.node1 < e1.node2;

自己結合は前後のエッジを照合し、e1.node1 が e1.node2 より小さいという要件により、照合された各エッジが 1 回だけ表示されることが保証されます。

後ろ向きのエッジがない場合にゼロを埋める要求に応じて編集します。

後方エッジが欠落している場合は、LEFT JOIN を実行し、CASE ステートメントを使用してギャップをゼロで埋めることができます。

INSERT INTO newedges
    SELECT
        e1.node1,
        e1.node2,
        e1.weight,
        CASE WHEN e2.weight IS NULL THEN 0.0 ELSE e2.weight END
    FROM edges AS e1 LEFT JOIN edges AS e2
    ON e1.node1=e2.node2 AND e1.node2=e2.node1
    WHERE e1.node1 < e1.node2;

それが役立つことを願っています!

于 2012-06-19T16:08:31.650 に答える