最近研究图数据库neo4j的时候发现了一个非常好玩的东西——利用图数据库分析非常火的美剧《权力的游戏》里面错综复杂的人物、领土等关系。

写在前面

本文不是科普图数据库neo4j的文章,所以不会涉及太多该数据库如何使用等细节(比如Node、Relationship、Property等概念,以及Cypher语法),但是也会简单涉及如何安装、配置等步骤,但是这不是重点,重点是用这个东西理出小说里面的人物关系等。如果对数据库本身有兴趣的,请移步http://neo4j.com。后续我应该也会写一些相关的文章来介绍该数据库如何使用。

所以,本文不是技术性文章,如果你是来学技术的,此时已经可以按下ctrl+w了。如果你是抱着娱乐的态度或者好奇心什么的来的,请继续...

开始娱乐

当然,我们得先安装neo4j这个数据库。因为我下载不下来安装包(说多了都是泪,用了VPN也不行...),所以我使用docker去安装,轻松又省事。如果不是需要研究源码的话,我推荐使用这种方式。

如果你对docker或者neo4j不是很熟悉,请按照我这里写的目录结构等去组织,可以少出一些问题。

步骤1. 下载docker镜像:

docker pull neo4j:3.2.3

步骤2. 创建一些相关目录:

mkdir -p $HOME/neo4j  
mkdir -p $HOME/neo4j/data
mkdir -p $HOME/neo4j/examples  
mkdir -p $HOME/neo4j/conf  
mkdir -p $HOME/neo4j/plugins

data目录用来存放数据库数据。
examples用来存放我们待会要演示的《权利的游戏》的例子。
conf用来存放数据库的配置。
plugins用来存放数据库的插件,因为我们的例子使用了一个插件。

步骤3. 配置数据库及插件

  1. 我们的例子用到了apoc插件,请去github下载:https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases。将下载的jar(apoc-3.2.0.4-all.jar)包放到刚才创建的plugins目录。
  2. 切换到neo4j目录下,执行下面的命令得到默认的配置文件:

    cd $HOME/neo4j 
    docker run neo4j:3.2.3 cat /var/lib/neo4j/conf/neo4j.conf  > conf/neo4j.conf

然后编辑conf/neo4j.conf文件,配置一下apoc插件,找到dbms.directories.import=import并将其注释掉,然后再其后面添加一行配置apoc.import.file.enabled=true,不然后面利用apoc导入数据的时候会抛异常。

步骤4. 下载示例工程到examples目录:

cd $HOME/neo4j/examples
git clone https://github.com/niyanchun/game-of-thrones.git

注意:该工程是我fork过来的,主要是将一些网络访问改为了本地访问,不然在国内或者你没有网的情况下是导入不了数据的。

步骤5. 启动neo4j:

## 启动容器
docker run -d --name=neo4j --publish=7474:7474 --publish=7687:7687 -v $HOME/neo4j/plugins:/var/lib/neo4j/plugins -v $HOME/neo4j/data:/data -v $HOME/neo4j/examples:/examples  -v $HOME/neo4j/neo4j.conf:/var/lib/neo4j/conf/neo4j.conf  neo4j:3.2.3

这样我们就启动了一个neo4j数据库,此时在浏览器中访问http://localhost:7474,就可以看到neo4j了,默认的用户名和密码都是neo4j,登录以后会强制改密码,假设我改为neo4j123(后面要用)。这里暴露的另外一个端口是bolt协议端口,API都走这个端口。

步骤6. 将《权利的游戏》相关数据导入到数据库

## 登录到容器里面
docker exec -it neo4j bash

## 导入数据
/var/lib/neo4j/bin/cypher-shell -a bolt://localhost:7687 -u neo4j -p neo4j123 < /examples/game-of-thrones/got-import.cypher

至此,大工搞成,是该见证奇迹的时候了。回到刚才的浏览器界面,在最顶端的命令框(前面有个$),里面输入:MATCH(n) RETURN n,回车!奇迹出现,如下图:

game-of-throne-overview.jpg

可以看到这个图里面包含了2814个Node和3233条relationship。好吧,说这些neo4j里面的概念不直观,再看,这个关系网里面包含了2134个人,444个城堡,224个海岸,12个区域。此时,我们点击右上角的图标可以全屏看,也可以导出成图片或者csv文件。我导出后的图有20多兆,这里来一个截图,和一个局部放大图:

截图:

game-of-throne-all.jpg

局部放大图:

game-of-throne-part1.jpg

分享一下我导出的全量图(20MB):http://pan.baidu.com/s/1pLmdIrD

PS:导出的图是可以放大看的哦~~

当然,看全量图太伤眼睛了,如果你只想了解其中某一个人的或者某一个地方的信息等,neo4j提供了类SQL的Cypher语言,可以查询哦~

最后再来一个彩蛋,国外有个人专门给《冰与火之歌》弄了一个网站,专门提供相关的API:https://anapioficeandfire.com.

参考:https://github.com/neo4j-examples/game-of-thrones