q17.sql 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. \set tag '\'Cosmic_Egg\''
  2. \set delta '12'
  3. -- materialize=> \i q17.sql
  4. -- person1.id | messagecount
  5. -- ------------+--------------
  6. -- (0 rows)
  7. --
  8. -- Time: 23811.382 ms (00:23.811)
  9. -- spooked by empty results, tried it for a more popular tag:
  10. --
  11. -- \set tag '\'Wolfgang_Amadeus_Mozart\''
  12. -- \set delta '12'
  13. -- Time: 1.440 ms
  14. -- materialize=> \i q17.sql
  15. -- person1.id | messagecount
  16. -- ----------------+--------------
  17. -- 19791209302816 | 67
  18. -- 2199023256087 | 50
  19. -- 19791209301614 | 43
  20. -- 13194139537074 | 42
  21. -- 17592186048228 | 42
  22. -- 13194139540244 | 40
  23. -- 2199023258027 | 39
  24. -- 6597069767000 | 37
  25. -- 8796093031814 | 36
  26. -- 3819 | 35
  27. -- (10 rows)
  28. --
  29. -- Time: 30821.626 ms (00:30.822)
  30. /* Q17. Information propagation analysis
  31. \set tag '\'Slavoj_Žižek\''
  32. \set delta '4'
  33. */
  34. WITH MyMessage as (
  35. SELECT *
  36. FROM Message
  37. -- (tag)<-[:HAS_TAG]-(message)
  38. WHERE MessageId in (SELECT MessageId FROM Message_hasTag_Tag WHERE TagId IN (SELECT id FROM Tag WHERE Tag.name = :tag))
  39. )
  40. -- (message1)-[:HAS_CREATOR]->(person1)
  41. SELECT Message1.CreatorPersonId AS "person1.id", count(DISTINCT Message2.MessageId) AS messageCount
  42. FROM MyMessage Message1
  43. -- (message2 <date filtering>})
  44. JOIN MyMessage Message2
  45. ON (Message1.creationDate + (:delta || ' hour')::interval) < Message2.creationDate
  46. JOIN MyMessage Comment
  47. ON Comment.ParentMessageId = Message2.MessageId
  48. -- (forum1)-[:Has_MEMBER]->(person2)
  49. JOIN Forum_hasMember_Person Forum_hasMember_Person2
  50. ON Forum_hasMember_Person2.ForumId = Message1.ContainerForumId -- forum1
  51. AND Forum_hasMember_Person2.PersonId = Comment.CreatorPersonId -- person2
  52. -- (forum1)-[:Has_MEMBER]->(person3)
  53. JOIN Forum_hasMember_Person Forum_hasMember_Person3
  54. ON Forum_hasMember_Person3.ForumId = Message1.ContainerForumId -- forum1
  55. AND Forum_hasMember_Person3.PersonId = Message2.CreatorPersonId -- person3
  56. WHERE Message1.ContainerForumId <> Message2.ContainerForumId
  57. -- person2 <> person3
  58. AND Forum_hasMember_Person2.PersonId <> Forum_hasMember_Person3.PersonId
  59. -- NOT (forum2)-[:HAS_MEMBER]->(person1)
  60. AND NOT EXISTS (SELECT 1
  61. FROM Forum_hasMember_Person Forum_hasMember_Person1
  62. WHERE Forum_hasMember_Person1.ForumId = Message2.ContainerForumId -- forum2
  63. AND Forum_hasMember_Person1.PersonId = Message1.CreatorPersonId -- person1
  64. )
  65. GROUP BY Message1.CreatorPersonId
  66. ORDER BY messageCount DESC, Message1.CreatorPersonId ASC
  67. LIMIT 10
  68. ;