基于社區(qū)發(fā)現(xiàn)算法和圖分析Neo4j解讀《權(quán)力的游戲》上篇

摘自:http://www.toutiao.com/a6305624170701783298/
其中的分析和可視化是用Gephi做的,Gephi是非常流行的圖分析工具氓涣。但作者覺得使用Neo4j來實(shí)現(xiàn)更有趣。

導(dǎo)入原始數(shù)據(jù)到Neo4j
原始數(shù)據(jù)可從網(wǎng)絡(luò)上下載昌妹,格式如下:
Source,Target,Weight
Aemon,Grenn,5
Aemon,Samwell,31
Aerys,Jaime,18 ...

上面是人物關(guān)系的之鄰接表以及關(guān)系權(quán)重寝衫。作者使用簡單的數(shù)據(jù)模型:
(:Character {name})-[:INTERACTS]->(:Character {name})

帶有標(biāo)簽Character的節(jié)點(diǎn)代表小說中的角色,用單向關(guān)系類型INTERACTS代表小說中的角色有過接觸啸澡。節(jié)點(diǎn)屬性會(huì)存儲(chǔ)角色的名字name,兩角色間接觸的次數(shù)作為關(guān)系的屬性:權(quán)重(weight)。
首先創(chuàng)建節(jié)點(diǎn)c铲咨,并做唯一限制性約束汹胃,c.name唯一,保證schema的完整性:
CREATE CONSTRAINT ON (c:Character) ASSERT c.name IS UNIQUE;

一旦約束創(chuàng)建即相應(yīng)的創(chuàng)建索引皮服,這將有助于通過角色的名字查詢的性能楞艾。作者使用Neo4j的Cypher(Cypher是一種聲明式圖查詢語言,能表達(dá)高效查詢和更新圖數(shù)據(jù)庫)LOAD CSV語句導(dǎo)入數(shù)據(jù):
LOAD CSV WITH HEADERS FROM "https://www.macalester.edu/~abeverid/data/stormofswords.csv" AS rowMERGE (src:Character {name: row.Source})MERGE (tgt:Character {name: row.Target})MERGE (src)-[r:INTERACTS]->(tgt)SET r.weight = toInt(row.Weight)

這樣得到一個(gè)簡單的數(shù)據(jù)模型:
CALL apoc.meta.graph

基于社區(qū)發(fā)現(xiàn)算法和圖分析Neo4j解讀《權(quán)力的游戲》上篇

圖1 :《權(quán)力的游戲》模型的圖龄广。Character角色節(jié)點(diǎn)由INTERACTS關(guān)系聯(lián)結(jié)
我們能可視化整個(gè)圖形硫眯,但是這并不能給我們很多信息,比如哪些是最重要的人物择同,以及他們相互接觸的信息:
MATCH p=(:Character)-[:INTERACTS]-(:Character) RETURN p

基于社區(qū)發(fā)現(xiàn)算法和圖分析Neo4j解讀《權(quán)力的游戲》上篇

圖2

人物網(wǎng)絡(luò)分析
作者使用Neo4j的圖查詢語言Cypher來做《權(quán)力的游戲》圖分析两入,應(yīng)用到了網(wǎng)絡(luò)分析的一些工具,具體見《網(wǎng)絡(luò)奠衔,人群和市場:關(guān)于高度連接的世界》谆刨。

人物數(shù)量
萬事以簡單開始塘娶。先看看上圖上由有多少人物:
MATCH (c:Character) RETURN count(c)

count(c)

107

概要統(tǒng)計(jì)
統(tǒng)計(jì)每個(gè)角色接觸的其它角色的數(shù)目:
MATCH (c:Character)-[:INTERACTS]->() WITH c, count(*) AS num RETURN min(num) AS min, max(num) AS max, avg(num) AS avg_characters, stdev(num) AS stdev

圖(網(wǎng)絡(luò))的直徑
網(wǎng)絡(luò)的直徑或者測(cè)底線或者最長最短路徑:
// Find maximum diameter of network // maximum shortest path between two nodes
MATCH (a:Character), (b:Character) WHERE id(a) > id(b) MATCH p=shortestPath((a)-[:INTERACTS*]-(b)) RETURN length(p) AS len, extract(x IN nodes(p) | x.name) AS path ORDER BY len DESC LIMIT 4

我們能看到網(wǎng)絡(luò)中有許多長度為6的路徑。

最短路徑
作者使用Cypher 的shortestPath函數(shù)找到圖中任意兩個(gè)角色之間的最短路徑痊夭。讓我們找出凱特琳·史塔克(Catelyn Stark )和卓戈·卡奧(Kahl Drogo)之間的最短路徑:
// Shortest path from Catelyn Stark to Khal Drogo
MATCH (catelyn:Character {name: "Catelyn"}), (drogo:Character {name: "Drogo"}) MATCH p=shortestPath((catelyn)-[INTERACTS*]-(drogo)) RETURN p

基于社區(qū)發(fā)現(xiàn)算法和圖分析Neo4j解讀《權(quán)力的游戲》上篇

圖3

所有最短路徑
聯(lián)結(jié)凱特琳·史塔克(Catelyn Stark )和卓戈·卡奧(Kahl Drogo)之間的最短路徑可能還有其它路徑刁岸,我們可以使用Cypher的allShortestPaths函數(shù)來查找:
// All shortest paths from Catelyn Stark to Khal Drogo
MATCH (catelyn:Character {name: "Catelyn"}), (drogo:Character {name: "Drogo"}) MATCH p=allShortestPaths((catelyn)-[INTERACTS*]-(drogo)) RETURN p

基于社區(qū)發(fā)現(xiàn)算法和圖分析Neo4j解讀《權(quán)力的游戲》上篇

圖4

關(guān)鍵節(jié)點(diǎn)
在網(wǎng)絡(luò)中,如果一個(gè)節(jié)點(diǎn)位于其它兩個(gè)節(jié)點(diǎn)所有的最短路徑上她我,即稱為關(guān)鍵節(jié)點(diǎn)虹曙。下面我們找出網(wǎng)絡(luò)中所有的關(guān)鍵節(jié)點(diǎn):
// Find all pivotal nodes in network
MATCH (a:Character), (b:Character) MATCH p=allShortestPaths((a)-[:INTERACTS*]-(b)) WITH collect(p) AS paths, a, b MATCH (c:Character) WHERE all(x IN paths WHERE c IN nodes(x)) AND NOT c IN [a,b] RETURN a.name, b.name, c.name AS PivotalNode SKIP 490 LIMIT 10
從結(jié)果表格中我們可以看出有趣的結(jié)果:羅柏·史塔克(Robb)是卓戈·卡奧(Drogo)和拉姆塞·波頓(Ramsay)的關(guān)鍵節(jié)點(diǎn)。這意味著番舆,所有聯(lián)結(jié)卓戈·卡奧(Drogo)和拉姆塞·波頓(Ramsay)的最短路徑都要經(jīng)過羅柏·史塔克(Robb)酝碳。我們可以通過可視化卓戈·卡奧(Drogo)和拉姆塞·波頓(Ramsay)之間的所有最短路徑來驗(yàn)證:
MATCH (a:Character {name: "Drogo"}), (b:Character {name: "Ramsay"}) MATCH p=allShortestPaths((a)-[:INTERACTS*]-(b)) RETURN p

基于社區(qū)發(fā)現(xiàn)算法和圖分析Neo4j解讀《權(quán)力的游戲》上篇

圖5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恨狈,隨后出現(xiàn)的幾起案子疏哗,更是在濱河造成了極大的恐慌,老刑警劉巖禾怠,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件返奉,死亡現(xiàn)場離奇詭異,居然都是意外死亡吗氏,警方通過查閱死者的電腦和手機(jī)芽偏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弦讽,“玉大人污尉,你說我怎么就攤上這事⊥” “怎么了被碗?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捂齐。 經(jīng)常有香客問我蛮放,道長,這世上最難降的妖魔是什么奠宜? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任包颁,我火速辦了婚禮,結(jié)果婚禮上压真,老公的妹妹穿的比我還像新娘娩嚼。我一直安慰自己,他們只是感情好滴肿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布岳悟。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贵少。 梳的紋絲不亂的頭發(fā)上呵俏,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音滔灶,去河邊找鬼普碎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛录平,可吹牛的內(nèi)容都是我干的麻车。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼斗这,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼动猬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起表箭,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤赁咙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后燃逻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體序目,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年伯襟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片握童。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姆怪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澡绩,到底是詐尸還是另有隱情稽揭,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布肥卡,位于F島的核電站溪掀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏步鉴。R本人自食惡果不足惜揪胃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氛琢。 院中可真熱鬧喊递,春花似錦、人聲如沸阳似。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俏讹,卻和暖如春当宴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泽疆。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工户矢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人于微。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓逗嫡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親株依。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驱证,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容