Статьи

Neo4j: На графике «Меня зовут… я работаю» Twitter meme

В течение последних нескольких дней я смотрел цепочку твитов «Меня зовут…», которые DHH с интересом начали . Насколько я понимаю, идея состоит в том, чтобы показать, что кодирование загадок интервью / сложных задач на доске смешно.

Другие люди процитировали этот твит и добавили свой собственный кусок, и вчера Эдуардо Эрнаки предложил, чтобы обход этой цепочки твитов казался специально созданным для Neo4j.

Майкл быстро появился на сцене и создал запрос Cypher, который вызывает API Twitter и создает график Neo4j из полученного ответа JSON. Единственным хитрым моментом является создание «токена на предъявителя», но у Джейсона Котчоффа есть полезная подсказка, показывающая, как сгенерировать один из вашего потребительского ключа Twitter и его потребительского секрета.

Теперь, когда у нас есть наш токен, давайте создадим параметр для его хранения. Введите следующее в браузере Neo4j:

1
:param bearer: '<your-bearer-token-goes-here>'

Теперь мы готовы сделать запрос к Twitter API. Мы начнем с API поиска и найдем все твиты с текстом «мое имя», «я работаю». Это вернет JSON-ответ, содержащий множество твитов. Затем мы создадим узел для каждого возвращаемого твита, узел для пользователя, который разместил твит, узел для твита, который он цитирует, и отношения, чтобы склеить их все вместе.

Мы собираемся использовать процедуру apoc.load.jsonParams из библиотеки APOC, чтобы помочь нам импортировать данные. Если вы хотите следовать, вы можете использовать экземпляр песочницы Neo4j, который поставляется с установленным APOC. Для локальной установки Neo4j, возьмите jar APOC и поместите его в папку плагинов перед перезапуском Neo4j.

Это запрос в полном объеме:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  
CALL apoc.load.jsonParams(url + "%22my%20name%22%20is%22%20%22I%20work%22",{Authorization:"Bearer "+bearer},null) yield value
  
UNWIND value.statuses as status
WITH status, status.user as u, status.entities as e
WHERE status.quoted_status_id is not null
  
// create a node for the original tweet
MERGE (t:Tweet {id:status.id})
ON CREATE SET t.text=status.text,t.created_at=status.created_at,t.retweet_count=status.retweet_count, t.favorite_count=status.favorite_count
  
// create a node for the author + a POSTED relationship from the author to the tweet
MERGE (p:User {name:u.screen_name})
MERGE (p)-[:POSTED]->(t)
  
// create a MENTIONED relationship from the tweet to any users mentioned in the tweet
FOREACH (m IN e.user_mentions | MERGE (mu:User {name:m.screen_name}) MERGE (t)-[:MENTIONED]->(mu))
  
// create a node for the quoted tweet and create a QUOTED relationship from the original tweet to the quoted one
MERGE (q:Tweet {id:status.quoted_status_id})
MERGE (t)–[:QUOTED]->(q)
  
// repeat the above steps for the quoted tweet
WITH t as t0, status.quoted_status as status WHERE status is not null
WITH t0, status, status.user as u, status.entities as e
  
MERGE (t:Tweet {id:status.id})
ON CREATE SET t.text=status.text,t.created_at=status.created_at,t.retweet_count=status.retweet_count, t.favorite_count=status.favorite_count
  
MERGE (t0)-[:QUOTED]->(t)
  
MERGE (p:User {name:u.screen_name})
MERGE (p)-[:POSTED]->(t)
  
FOREACH (m IN e.user_mentions | MERGE (mu:User {name:m.screen_name}) MERGE (t)-[:MENTIONED]->(mu))
  
MERGE (q:Tweet {id:status.quoted_status_id})
MERGE (t)–[:QUOTED]->(q);

Результирующий график выглядит так:

1
MATCH p=()-[r:QUOTED]->() RETURN p LIMIT 25

Более интересный запрос — найти путь от DHH до Eduardo, который мы можем найти с помощью следующего запроса:

1
2
3
4
match path = (dhh:Tweet {id: 834146806594433025})<-[:QUOTED*]-(eduardo:Tweet{id: 836400531983724545})
UNWIND NODES(path) AS tweet
MATCH (tweet)<-[:POSTED]->(user)
RETURN tweet, user

Этот запрос:

  • начинается с твита DHH
  • пересекает все цитируемые отношения, пока не найдет твит Эдуардо
  • собирает все эти твиты, а затем находит автора
  • возвращает твит и автора

И это вывод:

Я запустил несколько других запросов к API Twitter, чтобы увлажнить некоторые узлы, для которых мы не установили все свойства — вы можете увидеть все запросы в этой сущности .

В течение следующих нескольких дней у меня также есть песочница с https://10-0-1-157-32898.neo4jsandbox.com/browser/ . Вы можете войти, используя учетные данные только для чтения / Twitter .

Если у вас есть какие-либо вопросы / предложения, дайте мне знать в комментариях, @markhneedham в твиттере или по электронной почте команде разработчиков Neo4j DevRel — [email protected].