最近研究图数据库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. 配置数据库及插件
- 我们的例子用到了
apoc
插件,请去github下载:https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases。将下载的jar(apoc-3.2.0.4-all.jar)包放到刚才创建的plugins目录。 切换到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
,回车!奇迹出现,如下图:
可以看到这个图里面包含了2814个Node和3233条relationship。好吧,说这些neo4j里面的概念不直观,再看,这个关系网里面包含了2134个人,444个城堡,224个海岸,12个区域。此时,我们点击右上角的图标可以全屏看,也可以导出成图片或者csv文件。我导出后的图有20多兆,这里来一个截图,和一个局部放大图:
截图:
局部放大图:
分享一下我导出的全量图(20MB):http://pan.baidu.com/s/1pLmdIrD
PS:导出的图是可以放大看的哦~~
当然,看全量图太伤眼睛了,如果你只想了解其中某一个人的或者某一个地方的信息等,neo4j提供了类SQL的Cypher语言,可以查询哦~
最后再来一个彩蛋,国外有个人专门给《冰与火之歌》弄了一个网站,专门提供相关的API:https://anapioficeandfire.com.
interesting
厉害了我的哥,还真没玩过。
可以玩一下,蛮好玩的 :grin: