Neo4j:绘制“我的名字是……我在工作”图

在过去的几天里,我一直在关注DHH兴起的“我的名字是……”的推文。 据我了解,其想法是表明在白板上编写采访谜语/艰巨任务是荒谬的。

其他人引用了该推文并添加了自己的文章,昨天Eduardo Hernacki建议遍历这条推文链似乎是为Neo4j量身定制的。

Michael很快就出现在现场,并创建了一个Cypher查询,该查询调用Twitter API,并根据生成的JSON响应创建Neo4j图形。 唯一棘手的一点是创建“承载者令牌”,但是Jason Kotchoff有一个很有帮助的要点,展示了如何从您的Twitter消费者密钥和消费者秘密中生成一个。

现在我们已经获得了承载令牌,让我们创建一个参数来存储它。 在Neo4j浏览器中键入以下内容:

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

现在,我们准备查询Twitter API。 我们将从搜索API开始,找到包含文本“我的名字”“我在工作”'的所有推文。 这将返回一个包含大量推文的JSON响应。 然后,我们将为它返回的每个推文创建一个节点,为发布该推文的用户创建一个节点,为其引用的推文创建一个节点,以及将它们粘合在一起的关系。

我们将使用APOC库中apoc.load.jsonParams过程来帮助我们导入数据。 如果要继续学习,可以使用安装了APOC的Neo4j沙箱实例 。 对于本地Neo4j安装,在重新启动Neo4j之前,请抓住APOC jar并将其放入您的plugins文件夹中。

这是完整的查询:

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);

生成的图形如下所示:

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

一个更有趣的查询是找到从DHH到Eduardo的路径,我们可以通过以下查询找到该路径:

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

该查询:

  • 从DHH的推文开始
  • 遍历所有QUOTED关系,直到找到Eduardo的推文
  • 收集所有这些推文,然后找到作者
  • 返回推文和作者

这是输出:

我针对Twitter API进行了其他一些查询,以混合一些我们尚未设置所有属性的节点-您可以在此要点上查看所有查询

在接下来的几天里,我还将有一个运行https://10-0-1-157-32898.neo4jsandbox.com/browser/的沙箱。 您可以使用凭据readonly / twitter登录。

如果您有任何疑问/建议,请在评论中告诉我, 或者在Twitter上@markhneedham ,或给Neo4j DevRel团队发送电子邮件至devrel@neo4j.com。

翻译自: https://www.javacodegeeks.com/2017/03/neo4j-graphing-name-work-twitter-meme.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值