q18.sql 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. \set tag '\'Fyodor_Dostoyevsky\''
  2. -- materialize=> \i q18.sql
  3. -- person1.id | person2.id | mutualfriendcount
  4. -- ----------------+----------------+-------------------
  5. -- 2199023256539 | 24189255821523 | 31
  6. -- 24189255821523 | 2199023256539 | 31
  7. -- 15393162796970 | 24189255820514 | 25
  8. -- 24189255820514 | 15393162796970 | 25
  9. -- 4398046511410 | 13194139543082 | 23
  10. -- 10995116284091 | 24189255815677 | 23
  11. -- 13194139543082 | 4398046511410 | 23
  12. -- 24189255815677 | 10995116284091 | 23
  13. -- 24189255819695 | 24189255821523 | 20
  14. -- 24189255821523 | 24189255819695 | 20
  15. -- 24189255820514 | 24189255821523 | 18
  16. -- 24189255821523 | 24189255820514 | 18
  17. -- 2199023256539 | 15393162796970 | 17
  18. -- 2199023256539 | 24189255819695 | 17
  19. -- 13194139536963 | 13194139543082 | 17
  20. -- 13194139543082 | 13194139536963 | 17
  21. -- 15393162796970 | 2199023256539 | 17
  22. -- 17592186050431 | 26388279069225 | 17
  23. -- 24189255819695 | 2199023256539 | 17
  24. -- 26388279069225 | 17592186050431 | 17
  25. -- (20 rows)
  26. --
  27. -- Time: 2097.830 ms (00:02.098)
  28. /* Q18. Friend recommendation
  29. \set tag '\'Frank_Sinatra\''
  30. */
  31. WITH
  32. PersonWithInterest AS (
  33. SELECT pt.PersonId AS PersonId
  34. FROM Person_hasInterest_Tag pt, Tag t
  35. WHERE t.name = :tag AND pt.TagId = t.id
  36. ),
  37. FriendsOfInterested AS (
  38. SELECT k.Person1Id AS InterestedId, k.Person2Id AS FriendId
  39. FROM PersonWithInterest p, Person_knows_Person k
  40. WHERE p.PersonId = k.Person1Id
  41. )
  42. SELECT k1.InterestedId AS "person1.id", k2.InterestedId AS "person2.id", count(k1.FriendId) AS mutualFriendCount
  43. FROM FriendsOfInterested k1
  44. JOIN FriendsOfInterested k2
  45. ON k1.FriendId = k2.FriendId -- pattern: mutualFriend
  46. -- negative edge
  47. WHERE k1.InterestedId != k2.InterestedId
  48. AND NOT EXISTS (SELECT 1
  49. FROM Person_knows_Person k3
  50. WHERE k3.Person1Id = k2.InterestedId -- pattern: person2
  51. AND k3.Person2Id = k1.InterestedId -- pattern: person1
  52. )
  53. GROUP BY k1.InterestedId, k2.InterestedId
  54. ORDER BY mutualFriendCount DESC, k1.InterestedId ASC, k2.InterestedId ASC
  55. LIMIT 20
  56. ;