Как посчитать общих соседей двух пользователей и рассчитать сходство? - PullRequest
1 голос
/ 15 ноября 2010

Таблица month_connections содержит столбцы calling_party, called_party, common_neighbors, neighborhood_overlap

Таким образом, в таблице описано, какие пользователи подключены.Одной из мер для сходства пользователей является перекрытие соседства, которое определяется следующим образом:

окрестность_верла = (количество узлов, которые являются соседями и для Call_party, и для Call_party) / (количество узлов, которые являются соседями вхотя бы один из call_party или named_party)

Пытаясь вычислить количество общих соседей для двух пользователей, я написал следующий запрос:

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

Приведенный выше запрос вычисляет количество общихсоседи пользователей 10D149A4356E1AA3A8AF604BD992BBA141DB53D2 и 9F7334BCF9000CD68D40302DC4801E60C027A7D1

1014 * цель состоит в написании запроса, чтобы установить значение общих соседей столбцов и окрестности перекрытия для каждой пары соединения в таблице 1016 * кто-нибудь знаетКак написать запрос для обновления столбцов common_neighbors и district_overlap?

Для общих соседей я начал писать следующий запрос, но он неверен:

 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

1 Ответ

1 голос
/ 16 ноября 2010

Я думаю, что этот запрос работает (хотя может и не быть таким быстрым).

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
...