2010-11-15 13 views
1

La table monthly_connections contient des colonnes calling_party, called_party, common_neighbors, neighborhood_overlapComment compter les voisins communs de deux utilisateurs et calculer la similarité?

La table décrit donc les utilisateurs connectés. L'une des mesures de similitude utilisateur est un chevauchement de voisinage qui est défini comme suit:

neighborhood_overlap = (nombre de nœuds qui sont voisins des deux calling_party et called_party)/(nombre de nœuds qui sont voisins au moins l'un des calling_party ou called_party)

Essayer de calculer le nombre de voisins communs pour deux utilisateurs, j'ai écrit la requête suivante:

SELECT 
COUNT (*) FROM 
(SELECT t1.neighborA 
    FROM (
      SELECT called_party AS neighborA FROM monthly_connections 
      WHERE calling_party = '9F7334BCF9000CD68D40302DC4801E60C027A7D1' 
      UNION SELECT calling_party AS neighborA FROM monthly_connections 
       WHERE called_party = '9F7334BCF9000CD68D40302DC4801E60C027A7D1') t1     
      INNER JOIN (SELECT called_party AS neighborB FROM monthly_connections 
         WHERE calling_party = '10D149A4356E1AA3A8AF604BD992BBA141DB53D2' 
         UNION SELECT calling_party AS neighborB FROM monthly_connections 
          WHERE called_party = '10D149A4356E1AA3A8AF604BD992BBA141DB53D2') t2 ON t1.neighborA = t2.neighborB) t3 

La requête calcule au-dessus du nombre de voisins communs des utilisateurs 10D149A4356E1AA3A8AF604BD992BBA141DB53D2 et 9F7334BCF9000CD68D40302DC4801E60C027A7D1

Le but est d'écrire la requête pour définir la valeur de la colonne communes voisines et se chevauchent de voisinage pour chaque paire de connexion dans la table

Est-ce que quelqu'un sait comment écrire la requête pour mettre à jour les colonnes common_neighbors et neighborhood_overlap?

Pour voisins communs j'ai commencé à écrire la requête suivante mais il est inexact:

UPDATE mc SET 
    common_neighbors = 
    (SELECT COUNT (*) FROM 
(SELECT t1.neighborA FROM (SELECT called_party AS neighborA FROM monthly_connections WHERE calling_party = mc.calling_party UNION SELECT calling_party AS neighborA FROM monthly_connections WHERE called_party = mc.calling_party) t1 INNER JOIN (SELECT called_party AS neighborB FROM monthly_connections WHERE calling_party = mc.called_party UNION SELECT calling_party AS neighborB FROM monthly_connections WHERE called_party = mc.called_party) t2 ON t1.neighborA = t2.neighborB) t3) FROM monthly_connections mc INNER JOIN t3 ON t3.calling_party = mc.calling_party AND t3.called_party = mc.called_party 
+0

Vous trouverez plus de gens prêts à passer du temps sur vos questions quand vous apprenez à accepter la réponse « meilleur » et non seulement le « parfait » un – smirkingman

Répondre

1

Je pense que cette requête fonctionne (mais peut-être pas que performant).

UPDATE mc 
    SET common_neighbors = (SELECT COUNT (*) FROM 
    (
     (SELECT called_party FROM monthly_connections 
     WHERE calling_party = mc.calling_party 
     UNION 
     SELECT calling_party FROM monthly_connections 
     WHERE called_party = mc.calling_party 
    ) 
     INTERSECT 
     (SELECT calling_party FROM monthly_connections 
     WHERE called_party = mc.called_party 
     UNION 
     SELECT called_party FROM monthly_connections 
     WHERE calling_party = mc.called_party 
    ) 
    ) t1 
    ) FROM monthly_connections mc 
Questions connexes