其中的分析和可视化是用Gephi做的,Gephi是非常流行的图分析工具。但作者觉得使用Neo4j来实现更有趣。
节点中心度

节点中心度给出网络中节点的重要性的相对度量。有许多不同的方式来度量中心度,每种方式都代表不同类型的“重要性”。
度中心性(Degree Centrality)
度中心性是最简单度量,即为某个节点在网络中的联结数。在《权力的游戏》的图中,某个角色的度中心性是指该角色接触的其他角色数。作者使用Cypher计算度中心性:
MATCH (c:Character)-[:INTERACTS]- RETURN c.name AS character, count(*) AS degree ORDER BY degree DESC
character
degree
Tyrion
36
Jon
26
Sansa
26
Robb
25
Jaime
24
Tywin
22
Cersei
20
Arya
19
Joffrey
18
Robert
18
从上面可以发现,在《权力的游戏》网络中提利昂·兰尼斯特(Tyrion)和最多的角色有接触。鉴于他的心计,我们觉得这是有道理的。
加权度中心性(Weighted Degree Centrality)
作者存储一对角色接触的次数作为 INTERACTS 关系的 weight 属性。对该角色的 INTERACTS 关系的所有 weight 相加得到加权度中心性。作者使用Cypher计算所有角色的这个度量:
MATCH (c:Character)-[r:INTERACTS]- RETURN c.name AS character, sum(r.weight) AS weightedDegree ORDER BY weightedDegree DESC
character
weightedDegree
Tyrion
551
Jon
442
Sansa
383
Jaime
372
Bran
344
Robb
342
Samwell
282
Arya
269
Joffrey
255
Daenerys
232
介数中心性(Betweenness Centrality)
介数中心性:在网络中,一个节点的介数中心性是指其它两个节点的所有最短路径都经过这个节点,则这些所有最短路径数即为此节点的介数中心性。介数中心性是一种重要的度量,因为它可以鉴别出网络中的“信息中间人”或者网络聚类后的联结点。
图6中红色节点是具有高的介数中心性,网络聚类的联结点。
为了计算介数中心性,作者使用Neo4j 3.x或者apoc库。安装apoc后能用Cypher调用其170+的程序:
MATCH (c:Character) WITH collect(c) AS charactersCALL apoc.algo.betweenness(['INTERACTS'], characters, 'BOTH') YIELD node, scoreSET node.betweenness = scoreRETURN node.name AS name, score ORDER BY score DESC
name
score
Jon
1279.7533534055322
Robert
1165.6025171231624
Tyrion
1101.3849724234349
Daenerys
874.8372110508583
Robb
706.5572832464792
Sansa
705.1985623519137
Stannis
571.5247305125714
Jaime
556.1852522889822
Arya
443.01358430043337
Tywin
364.7212195528086
紧度中心性(Closeness centrality)
紧度中心性是指到网络中所有其他角色的平均距离的倒数。在图中,具有高紧度中心性的节点在聚类社区之间被高度联结,但在社区之外不一定是高度联结的。
图7 :网络中具有高紧度中心性的节点被其它节点高度联结
MATCH (c:Character) WITH collect(c) AS charactersCALL apoc.algo.closeness(['INTERACTS'], characters, 'BOTH') YIELD node, scoreRETURN node.name AS name, score ORDER BY score DESC
name
score
Tyrion
0.004830917874396135
Sansa
0.004807692307692308
Robert
0.0047169811320754715
Robb
0.004608294930875576
Arya

0.0045871559633027525
Jaime
0.004524886877828055
Stannis
0.004524886877828055
Jon
0.004524886877828055
Tywin
0.004424778761061947
Eddard
0.004347826086956522
使用python-igraph
Neo4j与其它工具(比如,R和Python数据科学工具)完美结合。我们继续使用apoc运行 PageRank和社区发现(community detection)算法。这里接着使用python-igraph计算分析。Python-igraph移植自R的igraph图形分析库。 使用 pip install python-igraph 安装它。
从Neo4j构建一个igraph实例
为了在《权力的游戏》的数据的图分析中使用igraph,首先需要从Neo4j拉取数据,用Python建立igraph实例。作者使用 Neo4j 的Python驱动库py2neo。我们能直接传入Py2neo查询结果对象到igraph的 TupleList 构造器,创建igraph实例:
from py2neo import Graphfrom igraph import Graph as IGraph graph = Graph query = ''' MATCH (c1:Character)-[r:INTERACTS]->(c2:Character) RETURN c1.name, c2.name, r.weight AS weight '''ig = IGraph.TupleList(graph.run(query), weights=True)
现在有了igraph对象,可以运行igraph实现的各种图算法来。
PageRank
作者使用igraph运行的第一个算法是PageRank。PageRank算法源自Google的网页排名。它是一种特征向量中心性(eigenvector centrality)算法。
在igraph实例中运行PageRank算法,然后把结果写回Neo4j,在角色节点创建一个pagerank属性存储igraph计算的值:
pg = ig.pagerank pgvs = for p in zip(ig.vs, pg): print(p) pgvs.append({"name": p[0]["name"], "pg": p[1]}) pgvs write_clusters_query = ''' UNWIND {nodes} AS n MATCH (c:Character) WHERE c.name = n.name SET c.pagerank = n.pg '''graph.run(write_clusters_query, nodes=pgvs)
现在可以在Neo4j的图中查询最高PageRank值的节点:
MATCH (n:Character) RETURN n.name AS name, n.pagerank AS pagerank ORDER BY pagerank DESC LIMIT 10
name
pagerank
Tyrion
0.042884981999963316
Jon
0.03582869669163558
Robb
0.03017114665594764
Sansa
0.030009716660108578
Daenerys
0.02881425425830273
Jaime
0.028727587587471206
Tywin
0.02570016262642541
Robert
0.022292016521362864
Cersei
0.022287327589773507
Arya
0.022050209663844467
社区发现(Community detection)
图8
社区发现算法用来找出图中的社区聚类。作者使用igraph实现的随机游走算法( walktrap)来找到在社区中频繁有接触的角色社区,在社区之外角色不怎么接触。
在igraph中运行随机游走的社区发现算法,然后把社区发现的结果导入Neo4j,其中每个角色所属的社区用一个整数来表示:
clusters = IGraph.community_walktrap(ig, weights="weight").as_clustering nodes = [{"name": node["name"]} for node in ig.vs]for node in nodes: idx = ig.vs.find(name=node["name"]).index node["community"] = clusters.membership[idx] write_clusters_query = ''' UNWIND {nodes} AS n MATCH (c:Character) WHERE c.name = n.name SET c.community = toInt(n.community) '''graph.run(write_clusters_query, nodes=nodes)
我们能在Neo4j中查询有多少个社区以及每个社区的成员数:
MATCH (c:Character) WITH c.community AS cluster, collect(c.name) AS members RETURN cluster, members ORDER BY cluster ASC
cluster
members
0
[Aemon, Alliser, Craster, Eddison, Gilly, Janos, Jon, Mance, Rattleshirt, Samwell, Val, Ygritte, Grenn, Karl, Bowen, Dalla, Orell, Qhorin, Styr]
1
[Aerys, Amory, Balon, Brienne, Bronn, Cersei, Gregor, Jaime, Joffrey, Jon Arryn, Kevan, Loras, Lysa, Meryn, Myrcella, Oberyn, Podrick, Renly, Robert, Robert Arryn, Sansa, Shae, Tommen, Tyrion, Tywin, Varys, Walton, Petyr, Elia, Ilyn, Pycelle, Qyburn, Margaery, Olenna, Marillion, Ellaria, Mace, Chataya, Doran]
2
[Arya, Beric, Eddard, Gendry, Sandor, Anguy, Thoros]
3
[Brynden, Catelyn, Edmure, Hoster, Lothar, Rickard, Robb, Roose, Walder, Jeyne, Roslin, Ramsay]
4
[Bran, Hodor, Jojen, Luwin, Meera, Rickon, Nan, Theon]
5
[Belwas, Daario, Daenerys, Irri, Jorah, Missandei, Rhaegar, Viserys, Barristan, Illyrio, Drogo, Aegon, Kraznys, Rakharo, Worm]
6
[Davos, Melisandre, Shireen, Stannis, Cressen, Salladhor]
7
[Lancel]
角色“大合影”
《权力的游戏》的权力图。节点的大小正比于介数中心性,颜色表示社区(由随机游走算法获得),边的厚度正比于两节点接触的次数。现在已经计算好这些图的分析数据,让我们对其进行可视化,让数据看起来更有意义。
Neo4j自带浏览器可以对Cypher查询的结果进行很好的可视化,但如果我们想把可视化好的图嵌入到其它应用中,可以使用Javascript可视化库Vis.js。从Neo4j拉取数据,用Vis.js的neovis.js构建可视化图。Neovis.js提供简单的API配置,例如:
var config = { container_id: "viz", server_url: "localhost", labels: { "Character": "name" }, label_size: { "Character": "betweenness" }, relationships: { "INTERACTS": }, relationship_thickness: { "INTERACTS": "weight" }, cluster_labels: { "Character": "community" } }; var viz = new NeoVis(config); viz.render;
其中:
节点带有标签Character,属性name;
节点的大小正比于betweenness属性;
可视化中包括INTERACTS关系;
关系的厚度正比于weight属性;
节点的颜色是根据网络中社区community属性决定;
从本地服务器localhost拉取Neo4j的数据;
在一个id为viz的DOM元素中展示可视化。
权力的游戏这部美剧,红袍女为什么不复活史坦尼斯?
《权力的游戏》第七季,龙妈下线最意难平,而且还是被雪诺这个大猪蹄子亲手杀了的。但从国家角度龙妈必须死,最后一战太残忍滥杀无辜。最喜欢猎狗跟洋葱骑士,小恶魔最后不喜欢他了,他最后怂恿雪诺杀龙妹。
二丫这个人物是权游的灵魂人物,虽然他的故事不是主线,可是依然在剧中发挥着承上启下的作用,他的经历正是反映了一个人的成长之路,由懦弱到强大,从幼稚天真到成熟冷静,二丫的经历是我们每个人必经之路,经历了挫折,甚至是生离死别,也依然不忘初心,强大自我,最后如愿以偿。小伙伴们也要学习二丫的精神,不是学习二丫的做法噢,要有不破楼兰终不还的精神去做每一件事,遇到挫折把它当做台阶,秉承初心,方得始终。
《权力的游戏》里每个角色都很复杂,善恶皆要深度解读,很难以黑白好坏去定义某一个人,甚至像乔弗里这种,我都没有对他达到厌恶的地步,毕竟只是一个角色,况且乔弗里这人太简单,做的恶也高深不到哪去,论身份,乔弗里比拉姆斯高贵很多倍,然而,论折磨人做坏事的段位,拉姆斯远胜于他。用提里昂的台词形容乔弗里:她有狼的血统,你有鹅的脑瓜。每个角色都挺有血有肉的,布蕾妮也不错,詹姆把头发剪了才发现他挺帅的,罗柏应该是最帅的,我觉得他比囧雪帅多了。
权力的游戏,非常喜欢小恶魔这个角色,智慧与品德并重,虽然是侏儒。瑟西的大儿子,一个冷血残酷的恶魔,他让我想起了藏匿于网络中的暴民,狰狞的张开血盆大口吞噬一切作为人的良知。在法制管理缺席时,网上世界如禽兽横行的蛮荒野地。
红袍女巫梅丽珊卓是光之王拉赫洛的女祭司,有预言能力,可以在光火中预知未来的一些事情,包括蓝礼、巴隆·葛雷乔伊、罗柏·史塔克和乔佛里·拜拉席恩的死等等。
红袍女巫是什么人?她经常在自己袍服的衣袋内装进各种各样的粉末,用来使火焰拥有不同的力量,比如真相、贪婪、恐惧甚至谋杀。当然咯,对于很多雪诺党来说,也正是她复活了我们啥都不懂的雪诺。她的实力是真的不容小觑。
因为她之前太信仰自己算预言的情况,认为斯坦尼斯是光选之子,然后死心塌地的跟随他。原本她出生于贫民窟,她的一生本如同普通的凡人一样结婚生子,最后一卷草席结束自己的生命。可是她被光之王选中成为了一生追随光的信徒,新的信仰赋予了它红宝石的强大魔力。
后来她成为光之王拉洛赫的女祭司,拥有从圣火的火焰中解读到,未来即将发生的部分情报的能力,然而她也有着自己独特的信仰,就是只忠诚于光之主的神选者。
对于神的指引,她深信不疑,为了达成神明的旨意,她什么手段都用过,哪怕被人看成魔鬼也在所不惜。她的存在似乎就是为了神,从这一点来看,红袍女巫还是相当纯粹的。

当初找到史坦尼斯的时候,并认定史坦尼斯是亚梭尔·亚亥的转世,最开始把史坦尼斯错认为天子,为了帮助他登上王位,以献祭为由害死了艾琳公主,用影子魔法杀害了更有希望胜利的蓝礼。
在黑水河一战失败后,她们的军队来到了长城北境被大雪所困没有粮食也没有退步,为了达到目的,将斯坦尼斯的女儿艾琳公主当作祭品活活烧死换来大雪消融。但最终斯坦尼斯还是被别人砍下头颅死去了,他的军队也全军覆没。
红袍女为什么帮助史坦尼斯?根据一本五千年前的亚夏古书预言,亚梭尔·亚亥将会重生,这位预言中的王子将与异鬼战斗。而这一切将发生在长夏之后,黑暗降临之时。这位“王子”将重新唤出光明使者,与异鬼作战,如果他失败了,整个世界将万劫不复。
亚梭尔·亚亥即是贯穿整部剧的那位“光之王”。而梅丽珊卓不像其他拥有预言能力的维斯特洛人,她完全相信自己对于预言的解读。她相信史坦尼斯就是拉赫洛预言中的亚梭尔·亚亥重生。她告诉史坦尼斯,他会得到击败拉赫洛的敌人远古异神的力量。所以简单来说,她相信自己的预言,相信史坦尼斯是那位天选之人,所以她就要紧紧抱住大腿!但是看过剧的人自然会知道,她的预言也不是次次都对,至少在我个人看来,史坦尼斯是她错误的选择。
免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报
举报