PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So aggregieren Sie übereinstimmende Paare zu verbundenen Komponenten in Python

Mit networkX:

import networkx as nx
G1=nx.Graph()
G1.add_edges_from([("a","b"),("b","c"),("c","d"),("d","e"),("f","g")])
sorted(nx.connected_components(G1), key = len, reverse=True)

Angabe:

[['a', 'd', 'e', 'b', 'c'], ['f', 'g']]

Sie müssen jetzt den schnellsten Algorithmus prüfen ...

OP:

Das funktioniert super! Ich habe das jetzt in meiner PostgreSQL-Datenbank. Organisieren Sie einfach Paare in einer zweispaltigen Tabelle und verwenden Sie dann array_agg() an die PL/Python-Funktion get_connected() zu übergeben . Danke.

CREATE OR REPLACE FUNCTION get_connected(
    lhs text[],
    rhs text[])
  RETURNS SETOF text[] AS
$BODY$
    pairs = zip(lhs, rhs)

    import networkx as nx
    G=nx.Graph()
    G.add_edges_from(pairs)
    return sorted(nx.connected_components(G), key = len, reverse=True)

$BODY$ LANGUAGE plpythonu;

(Hinweis:Ich habe die Antwort bearbeitet, da ich dachte, dass das Anzeigen dieses Schritts ein hilfreicher Nachtrag sein könnte, aber zu lang für einen Kommentar.)