PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment agréger des paires correspondantes dans des composants connectés en Python

Avec 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)

donner :

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

Vous devez vérifier l'algorithme le plus rapide maintenant...

OP :

Cela fonctionne très bien ! J'ai ceci dans ma base de données PostgreSQL maintenant. Organisez simplement les paires dans un tableau à deux colonnes, puis utilisez array_agg() passer à la fonction PL/Python get_connected() . Merci.

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;

(Remarque :j'ai modifié la réponse, car je pensais que montrer cette étape pourrait être un complément utile, mais trop long pour un commentaire.)