В течение последних нескольких дней я смотрел цепочку твитов «Меня зовут…», которые 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
|
WITH 'https://api.twitter.com/1.1/search/tweets.json?count=100&result_type=recent⟨=en&q=' as url, {bearer} as bearer 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].
Ссылка: | Neo4j: На графике «Меня зовут… я работаю» твиттер-мем от нашего партнера по JCG Марка Нидхэма в блоге Марка Нидхэма . |