q16.sql 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. \set tagA '\'Diosdado_Macapagal\''
  2. \set dateA '\'2012-10-07\''::timestamp
  3. \set tagB '\'Thailand_Noriega\''
  4. \set dateB '\'2012-12-14\''::timestamp
  5. \set maxKnowsLimit '5'
  6. -- materialize=> \i q16.sql
  7. -- personid | messagecounta | messagecountb
  8. -- ----------+---------------+---------------
  9. -- (0 rows)
  10. --
  11. -- Time: 14005.429 ms (00:14.005)
  12. -- apparently no results is common... searching a few other parameters still turned up no results
  13. /* Q16. Fake news detection
  14. \set tagA '\'Augustine_of_Hippo\''
  15. \set dateA '\'2011-10-10\''::timestamp
  16. \set tagB '\'Manuel_Noriega\''
  17. \set dateB '\'2012-06-02\''::timestamp
  18. \set maxKnowsLimit '5'
  19. */
  20. WITH
  21. subgraphA AS (
  22. SELECT DISTINCT Person.id AS PersonId, Message.MessageId AS MessageId
  23. FROM Person
  24. JOIN Message
  25. ON Message.CreatorPersonId = Person.id
  26. AND Message.creationDate::date = :dateA
  27. JOIN Message_hasTag_Tag
  28. ON Message_hasTag_Tag.MessageId = Message.MessageId
  29. JOIN Tag
  30. ON Tag.id = Message_hasTag_Tag.TagId
  31. AND Tag.name = :tagA
  32. ),
  33. personA AS (
  34. SELECT
  35. subgraphA1.PersonId,
  36. count(DISTINCT subgraphA1.MessageId) AS cm,
  37. count(DISTINCT Person_knows_Person.Person2Id) AS cp2
  38. FROM subgraphA subgraphA1
  39. LEFT JOIN Person_knows_Person
  40. ON Person_knows_Person.Person1Id = subgraphA1.PersonId
  41. AND Person_knows_Person.Person2Id IN (SELECT PersonId FROM subgraphA)
  42. GROUP BY subgraphA1.PersonId
  43. HAVING count(DISTINCT Person_knows_Person.Person2Id) <= :maxKnowsLimit
  44. ORDER BY subgraphA1.PersonId ASC
  45. ),
  46. subgraphB AS (
  47. SELECT DISTINCT Person.id AS PersonId, Message.MessageId AS MessageId
  48. FROM Person
  49. JOIN Message
  50. ON Message.CreatorPersonId = Person.id
  51. AND Message.creationDate::date = :dateB
  52. JOIN Message_hasTag_Tag
  53. ON Message_hasTag_Tag.MessageId = Message.MessageId
  54. JOIN Tag
  55. ON Tag.id = Message_hasTag_Tag.TagId
  56. AND Tag.name = :tagB
  57. ),
  58. personB AS (
  59. SELECT
  60. subgraphB1.PersonId,
  61. count(DISTINCT subgraphB1.MessageId) AS cm,
  62. count(DISTINCT Person_knows_Person.Person2Id) AS cp2
  63. FROM subgraphB subgraphB1
  64. LEFT JOIN Person_knows_Person
  65. ON Person_knows_Person.Person1Id = subgraphB1.PersonId
  66. AND Person_knows_Person.Person2Id IN (SELECT PersonId FROM subgraphB)
  67. GROUP BY subgraphB1.PersonId
  68. HAVING count(DISTINCT Person_knows_Person.Person2Id) <= :maxKnowsLimit
  69. ORDER BY subgraphB1.PersonId ASC
  70. )
  71. SELECT
  72. personA.PersonId AS PersonId,
  73. personA.cm AS messageCountA,
  74. personB.cm AS messageCountB
  75. FROM personA
  76. JOIN personB
  77. ON personB.PersonId = personA.PersonId
  78. ORDER BY personA.cm + personB.cm DESC, PersonId ASC
  79. LIMIT 20
  80. ;