GraphGists

媒体、政治与图

我亲爱的朋友,也是neo4j社区成员Ron最近向我指出了一个令人惊叹的作品。Thomas Boeschoten,乌得勒支数据学院的成员,以及其他许多身份,发表了一些关于分析荷兰脱口秀节目的惊人作品,使用Gephi作为他的工具之一。他的一些结果令人着迷,并且非常酷炫。

netwerk

…​

我不会试图帮助你理解Thomas研究的深度,我只是想使用neo4j来试用一下他慷慨分享的数据集。

导入数据集

Rik最初从Gephi导入了20倍大的数据集,但此GraphGist使用的是原始数据集的采样版本

…​

但是,当我启动服务器时,我很快发现我需要做一些工作:)……Thomas创建的图并没有真正的“数据库式”模型(例如,它没有对模型进行任何规范化),并且neo4j浏览器看起来有点无聊

Screen%2BShot%2B2014 03 23%2Bat%2B19.28.11

我需要为此添加一些结构,以便能够有意义地对其进行查询。

添加模型

在浏览数据后,我决定我将要使用的模型看起来像这样

Screen%2BShot%2B2014 03 23%2Bat%2B19.34.51

您可以看到它不是一个很大的图

MATCH (n)
RETURN head(labels(n)) as labels,count(*) as count

但它连接非常密集——节点之间存在大量关系

MATCH (n)-[r]->(m)
RETURN head(labels(n)) as start, type(r) as rel, head(labels(m)) as end, count(*) as count

所以现在我可以对数据进行一些更有趣的查询,并看看是否像Thomas的研究一样,我能够发现一些关于此数据集的有趣信息。开始使用:Cypher查询!

让我们从一些简单的查询开始。让我们找出有多少人访问了不同的节目

match (g:GUEST)-[v:VISITED]->(sh:SHOW)
return sh.id as Show, count(v) as NrOfVisits
order by NrOfVisits desc;

我们立即就能感受到主要的脱口秀节目

但是,让我们看看其中有多少脱口秀嘉宾是政治人物(或者至少有政治关系)。让我们稍微扩展一下查询

match (g:GUEST)-[v:VISITED]->(sh:SHOW),
g-[:AFFILIATED_WITH]->(p:PARTY)
return sh.id as Show, count(v) as NrOfVisits
order by NrOfVisits desc;

看看节目的排名是否有任何差异

有趣。正如你所看到的,确实存在一些差异。

现在让我们看看我们数据集中另一个视角:性别。让我们看看所有这些节目中男性/女性嘉宾的分布

match (g:GUEST)-[:HAS_GENDER]->(gen:GENDER),
(g)-[v:VISITED]->(sh:SHOW)
return gen.name, count(v)
order by gen.name ASC;

我们仍然可以清楚地看到男性在这些节目中的主导地位

如果我们再次添加政治维度,并查看节目中政治访客的性别分布

match (g:GUEST)-[:HAS_GENDER]->(gen:GENDER),
(g)-[v:VISITED]->(sh:SHOW),
(g)-[:AFFILIATED_WITH]->(p:PARTY)
return gen.name, count(v)
order by gen.name ASC;

那么我们可以看到分布大体相同

我相信还有很多其他的查询可以考虑,但在本文中,我再做一个:让我们看看不同节目之间在嘉宾访问方面有哪些重叠。为此,我们只需要计算两个节目之间的某些路径:DWDD和P&W。

match p = AllShortestPaths((s1:SHOW {id:"DWDD"})-[*..2]-(s2:SHOW {id:"P&W"}))
return nodes(p)
limit 5;

结果正是你所期望的:巨大的重叠——至少在这两个(见上文:最大)节目之间。因此查询中的“limit 5”——以便我的可怜的neo4j浏览器能够存活下来

总结

到目前为止,我就讲这么多。您可以从这里下载数据库。我在上面使用的查询都放在github上。

在我看来,我认为这些类型的数据集极其有趣且强大。我希望看到更多像Thomas这样的工作,来自我自己的国家或国外,并从更广泛的角度看待这个问题。无论如何,我要感谢并赞扬Thomas的工作——并期待您的反馈。

希望这有帮助。

干杯

Rik

再次链接到原始帖子