基于社区发现算法和图分析的Secondary解读《权力的游戏》第二部
节点中心性
节点中心性给出了网络中节点重要性的相对度量。有许多不同的方法来衡量中心性,每种方法代表不同类型的“重要性”。
程度中心性
度中心性是最简单的度量,它是网络中节点的连接数。在《权力的游戏》图中,一个角色的度中心性是指该角色所接触的其他角色的数量。作者使用Cypher来计算程度中心性:
MATCH(c:Character)-[:interactions]-返回c.name作为字符,count(*)作为按DESC度排序的度
性格;角色;字母
程度
提利昂
36
【男性名字】乔恩
26
珊莎
26
罗伯
25
杰米
24
泰温
22
瑟曦
20
艾利亚
19
乔佛里
18
罗伯特
18
从上面我们可以发现,提利昂·兰尼斯特是《权力的游戏》中接触最多的人物。鉴于他的计算,我们认为这是有道理的。
加权度中心性
作者将一对角色之间的联系数量存储为交互关系的权重属性。将所有角色互动的权重相加,得到加权的中心度。作者使用Cypher来计算所有角色的这一指标:
MATCH(c:Character)-[r:interactions]-返回c.name作为字符,sum(r.weight)作为加权度按加权度DESC排序
性格;角色;字母
加权度数
提利昂
551
【男性名字】乔恩
442
珊莎
383
杰米
372
糠
344
罗伯
342
萨姆韦尔
282
艾利亚
269
乔佛里
255
丹妮莉丝
232
中间中心性
中间中心性:在一个网络中,一个节点的中间中心性是指另外两个节点的所有最短路径都经过这个节点,所以所有的最短路径都是这个节点的中间中心性。中位数中心性是一个重要的度量,因为它可以识别网络中的“信息中间人”或网络聚类后的连接点。
图6中的红色节点是具有高介数中心性和网络聚类的连接点。
为了计算中间性的中心性,作者使用了第二个3。x或apoc库。安装apoc后,可以使用Cypher调用其170+程序:
MATCH(c:Character)WITH collect(c)AS characters call apoc . algo . between ness([' interactions '],characters,' BOTH') YIELD node,score set node . between ness = score return node . name作为名称,按分数DESC进行分数排序
名字
得分
【男性名字】乔恩
1279.7533534055322
罗伯特
1165.6025171231624
提利昂
1101.3849724234349
丹妮莉丝
874.8372110508583
罗伯
706.5572832464792
珊莎
705.1985623519137
史坦尼斯
571.5247305125714
杰米
556.1852522889822
艾利亚
443.01358430043337
泰温
364.7212195528086
接近中心性
紧密中心性是指到网络中所有其他角色的平均距离的倒数。在图中,具有高紧密度中心性的节点在聚类社区之间是高度连通的,但是在社区之外它们不一定是高度连通的。
图7:网络中具有高紧密度中心性的节点被其他节点高度连接。
MATCH(c:Character)WITH collect(c)AS characters call apoc . algo . closure([' interactions '],characters,' BOTH') YIELD node,scoreRETURN node.name AS name,score ORDER BY score DESC
名字
得分
提利昂
0.004830917874396135
珊莎
0.004807692307692308
罗伯特
0.0047169811320754715
罗伯
0.004608294930875576
艾利亚
0.0045871559633027525
杰米
0.004524886877828055
史坦尼斯
0.004524886877828055
【男性名字】乔恩
0.004524886877828055
泰温
0.004424778761061947
艾德
0.004347826086956522
使用python-igraph。
Secondary与其他工具(如R和Python数据科学工具)完美集成。我们继续使用apoc来运行PageRank和社区检测算法。这里用python-igraph进行计算分析。Python-igraph移植自R的igraph图形分析库。使用pip install python-igraph进行安装。
构建igraph实例Neo4j Secondary
为了在《权力的游戏》中使用igraph对数据进行图形分析,我们首先用Neo4j从Secondary中拉取数据,用Python构建一个igraph实例。作者使用Python驱动库py2neo Neo4j Secondary。我们可以直接将Py2neo查询结果对象传入igraph的TupleList构造函数来创建igraph实例:
从py2neo导入图表从igraph导入图表作为I Graph Graph = Graph query = ' ' ' MATCH(c 1:Character)-[r:interactions]-& gt;(c2:Character)返回c1.name,c2.name,r.weight AS weight '''ig = IGraph。TupleList(graph.run(query),weights=True)
现在有了igraph对象,就可以运行由igraph实现的各种图形算法了。
PageRank
作者用igraph运行的第一个算法是PageRank。PageRank算法来源于Google的网页排名。这是一种特征向量中心性的算法。
在igraph实例中运行pagerank算法,然后将结果写回Secondary,在角色Neo4j中创建一个PageRank属性来存储igraph计算的值:
pg = ig . page rank 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)其中c . name = n . name SET c . page rank = n . pg ' ' ' graph . run(write _ clusters _ query,nodes=pgvs)
现在您可以在Secondary的图表中查询具有最高PageRank值的节点:
MATCH (n:Character)返回n.name作为name,n.pagerank作为pagerank ORDER BY pagerank DESC限制10
名字
pagerank
提利昂
0.042884981999963316
【男性名字】乔恩
0.03582869669163558
罗伯
0.03017114665594764
珊莎
0.030009716660108578
丹妮莉丝
0.02881425425830273
杰米
0.028727587587471206
泰温
0.02570016262642541
罗伯特
0.022292016521362864
瑟曦
0.022287327589773507
艾利亚
0.022050209663844467
社区检测(社区检测)
图8
社区发现算法用于找出图中的社区簇。作者使用igraph实现的随机行走算法(walktrap)寻找社区内联系频繁的人物社区,而人物在社区外联系不多。
在igraph中运行随机游走社区发现算法,然后将社区发现的结果导入Secondary,其中每个角色所属的社区用整数表示:
clusters = I graph . community _ walk trap(ig,weights="weight ")。as _ clustering nodes =[{ " name ":node[" name "]} for node in ig . vs]for node:idx = ig . vs . find(name = node[" name "])。index node[" community "]= clusters . membership[idx]write _ clusters _ query = ' ' ' UNWIND { nodes } AS n MATCH(c:Character)其中c . name = n . name SET c . community = toInt(n . community)' ' ' graph . run(write _ clusters _ query,nodes=nodes)
我们可以在Secondary中查询有多少个社区以及每个社区中的成员数量:
MATCH (c:Character)与c.community作为集群,collect(c.name)作为成员返回集群,成员按集群ASC排序
串
成员
[伊蒙,艾里沙,克拉斯特,埃迪逊,吉利,雅诺斯,琼恩,曼斯,摇铃衫,萨姆威尔,瓦尔,耶哥蕊特,葛兰,卡尔,鲍文,达拉,奥雷尔,霍林,斯泰尔]
1
[艾瑞斯、阿莫里、巴隆、布蕾妮、波隆、瑟曦、格雷果、詹姆、乔佛里、琼恩·艾林、凯旺、洛拉斯、莱莎、梅林、弥赛菈、奥伯林、波德瑞克、蓝礼、罗伯特、罗伯特·艾林、珊莎、雪伊、托曼、提利昂、泰温、瓦里斯、沃顿、培提尔、伊利亚、伊林、派席尔、Qyburn、玛格丽、奥莱娜、玛丽里昂、埃拉利亚、梅斯、查塔亚、多兰]
2
[艾莉亚,贝里奇,艾德,詹德利,桑多,安圭,索罗斯]
三
[布林登,凯特琳,艾德慕,霍斯特,洛萨,里卡德,罗柏,卢斯,瓦尔德,珍妮,罗斯林,拉姆齐]
四
[布兰,阿多,乔金,卢温,米拉,瑞肯,南,席恩]
五
[贝尔瓦斯、达里奥、丹妮莉丝、伊丽、乔拉、米桑代、雷加、韦赛里斯、巴利斯坦、伊利里欧、卓戈、伊耿、克拉兹尼、拉哈洛、沃姆]
六
[达沃斯、梅丽珊卓、希琳、史坦尼斯、克雷森、萨拉多]
七
[兰瑟尔]
角色“大照片”
《权力的游戏》权力图。节点的大小与介数成正比,颜色代表社区(由随机游走算法得到),边的粗细与两个节点的接触次数成正比。现在这些图的分析数据已经计算出来了,让我们把它们可视化,让数据看起来更有意义。
Secondary自带的浏览器可以很好的将Cypher查询的结果可视化,但是如果要将可视化的图嵌入到其他应用中,可以使用Javascript可视化库Vis.js从secondary中拉取数据,使用Vis.js的neoVis.js来构造可视化图。Neovis.js提供简单的API配置,比如:
var config = { container_id: "viz ",server_url: "localhost ",labels: { "Character": "name" },label _ size:{ " Character ":" between ness " },relationship:{ " interactions ":},relationship _ thickness:{ " interactions ":" weight " },cluster _ labels:{ " Character ":" community " };var viz = new NeoVis(配置);即渲染;
其中包括:
节点标有字符和属性名称;;
节点的大小与介数属性成比例;
可视化包括交互关系;
关系的粗细与权重属性成正比;
根据网络中的社区属性确定节点的颜色;
从本地服务器localhost中提取辅助节点的数据;
在id为viz的DOM元素中显示可视化效果。