原文鏈接:https://tbgraph.wordpress.com/2017/10/28/neo4j-marvel-social-graph-analysis/
譯者言:原文篇副較長呢铆,為了方便閱讀蝙斜,這里將原文拆成上下兩篇。上篇主要介紹了桶算法,三角形計數(shù)幾個分析方法赤兴,下篇主要介紹聚類系數(shù),連通分量禀综,加權(quán)連通分量幾種分析方法击胜,總體而言還都是比較基礎(chǔ)的分析方法。本文是上篇
本文是漫威社交網(wǎng)絡(luò)分析序列的第二篇桦沉,上一篇文章中每瞒,我們已經(jīng)將Kaggle競賽的帖子中漫威的數(shù)據(jù)導(dǎo)入到Neo4j中,同時演示了如何從二分圖映射到單分圖纯露。我們也使用了一個簡單的模型剿骨,將任何兩位英雄一起出現(xiàn)在漫畫的次數(shù)記錄下來。
譯者言:“兩位英雄一起出現(xiàn)在漫畫的次數(shù)”指在一本漫畫中埠褪,有兩位英雄出現(xiàn)了浓利,則計為1次,如在兩本漫畫中都出現(xiàn)钞速,則為2次贷掖。
為了便于理解,我們使用下面的函數(shù)來表示:
由
(:Hero)←(:Comic)→(:Hero)
到
(:Hero)←[:KNOWS{weight=一起出現(xiàn)在漫畫中的次數(shù)}]→(:Hero)
同時渴语,也可以映射到下面這種單分圖
(:Comic)←[{weight=同時出現(xiàn)英雄的個數(shù)}]→(:Comic)
好苹威,先這些,導(dǎo)入圖數(shù)據(jù)后驾凶,我們可以進(jìn)行接下來的分析了牙甫。
基本要求
Neo4j(https://neo4j.com/download/)
Neo4j官方圖算法庫(https://github.com/neo4j-contrib/neo4j-graph-algorithms/)
Apoc插件(https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases)
圖模型
我們已經(jīng)有一個簡單圖模型掷酗,接下來從Hero和Comics的二分圖網(wǎng)絡(luò)(兩種結(jié)點類型)開始,根據(jù)兩個英雄出現(xiàn)在同一個漫畫中的次數(shù)推導(dǎo)出一個單分圖(只有一種結(jié)點類型)腹暖。
開始分析
下面我們將在之前推導(dǎo)出來的單分圖上進(jìn)行一些分析汇在。關(guān)于數(shù)據(jù)分析,我通常的習(xí)慣是先進(jìn)行一些全局性的統(tǒng)計脏答,對圖有一個大概的感性的認(rèn)識糕殉,然后再深入研究細(xì)節(jié)。
權(quán)重分布
我們先來看一下具有相似權(quán)重的英雄分布情況殖告。權(quán)重值指兩英雄在相同漫畫中一塊出現(xiàn)的總次數(shù)阿蝶。
MATCH ()-[k:KNOWS]->()
RETURN (k.weight / 10) * 10 as weight,count(*) as count
ORDER BY count DESC LIMIT 20
第一眼看到這個查詢語句,發(fā)現(xiàn)?(k.weight / 10) * 10?這樣的子句出現(xiàn)黄绩,一定會認(rèn)為這是非常傻的語句羡洁。但是如果你了解Neo4j的計算規(guī)則(兩個整數(shù)相除得到仍是整數(shù)),就會明白爽丹,我們這種寫法筑煮,是為了完成一個“桶”函數(shù)的功能,即把權(quán)重都分配到10倍數(shù)的桶里粤蝎。這樣就很容易理解下面的結(jié)果了真仲。
?從結(jié)果中可以看出,在漫威英雄網(wǎng)絡(luò)中初澎,在171644個關(guān)系中秸应,有162489個關(guān)系(點總關(guān)系數(shù)據(jù)的94%)的權(quán)重是在10以下,也就是說碑宴,大部分英雄之間只有一面之緣软啼。
權(quán)重最大值是724,出現(xiàn)在“THING/BENJAMIN J. GR”(石頭人)和“HUMAN TORCH/JOHNNY S”(霹靂火),這倆真是一對好基友延柠。
譯者言:石頭人和霹靂火是神奇四俠中的英雄祸挪。實際上權(quán)重排名的前三都是神奇四俠的人。
盡管在漫威英雄的社交網(wǎng)絡(luò)中捕仔,大家都是彼此認(rèn)識的匕积,但是通過權(quán)重可以看出,大部分都是很弱的聯(lián)系榜跌。我大膽做兩個假設(shè):
大部分漫畫都有自己的英雄團(tuán)隊,但團(tuán)隊全體成員并不會在漫畫的每一集都會有出現(xiàn)盅粪。
偶爾會有幾集漫畫钓葫,不同英雄團(tuán)隊的英雄會一起出現(xiàn),因此會出現(xiàn)一些弱關(guān)系票顾。
為了驗證我的假設(shè)础浮,我先使用下面的查詢語句試試帆调。
MATCH (u:Comic)
RETURN avg(apoc.node.degree(u,'APPEARED_IN')) as average_heroes,
stdev(apoc.node.degree(u,'APPEARED_IN')) as stdev_heroes,
max(apoc.node.degree(u,'APPEARED_IN')) as max_heroes,
min(apoc.node.degree(u,'APPEARED_IN')) as min_heroes
上面顯示的是一些平均指標(biāo),而我個人更喜歡看分布情況豆同,就像我之前所使用的“桶”函數(shù)那樣:
MATCH (u:Comic)
RETURN (size((u)-[:APPEARED_IN]-()) / 10) * 10 as heroCount,
count(*) as times
ORDER BY times DESC limit 20
看起來我的假設(shè)好像還成番刊,8999(71%)個英雄在漫畫中出現(xiàn)的次數(shù)少于10次,加上前面平均每集7.5個英雄的推斷影锈,可以知道芹务,大部漫畫中可能只出現(xiàn)5個英雄或更少。有些漫畫會有“家族聚會”的情況鸭廷,這時會有超過30個英雄出現(xiàn)枣抱。有一集漫畫叫COCI,就有110個英雄出現(xiàn)辆床,應(yīng)該是《超級英雄大會》那期佳晶。
權(quán)重規(guī)一化
我們可以使用max或min方法將權(quán)重值進(jìn)行規(guī)一化處理。注意這次我們使用的?(toFloat(k1.weight) - min) / (max - min)?讼载,先將將k1.weight轉(zhuǎn)換成浮點型轿秧,這樣浮點型除以整形,得到的仍是浮點型咨堤。也就不會分組到之前的桶里了菇篡。
MATCH (:Hero)-[k:KNOWS]->(:Hero)
//get the the max and min value
WITH max(k.weight) as max,min(k.weight) as min
MATCH (:Hero)-[k1:KNOWS]->(:Hero)
//normalize
SET k1.weight_minmax = (toFloat(k1.weight) - min) / (max - min)
譯者言:上面的語句為每個KNOWS關(guān)系都增加了一個規(guī)一化的權(quán)重屬性weight_minmax
上面可以看出來,這些分析還是非常簡單的吱型,原文作者寫的非常棒逸贾,從簡入手,讓我們看起來比較好理解津滞,稍后下篇時铝侵,會慢慢的增加更多的知識點。