疯狂丛林图,第五卷

介绍
创建此 GraphGist 的目的是
-
对 neo4j 进行第一个 graphgist 测试
-
以交互方式突出显示此漫画中角色之间的关系
已撰写 LinkedIn 文章,可在以下位置查看:https://goo.gl/dvnL3Z

数据加载
我们从 Github 上准备好的数据集(csv 文件)构建图(https://github.com/adriens/brousse-en-folie-network)。
首先是节点(英雄)
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/adriens/brousse-en-folie-network/master/nodes.csv" AS csvLine
CREATE (p:Hero {id: csvLine.id, name: csvLine.label});
,然后是关系
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/adriens/brousse-en-folie-network/master/edges.csv" AS edges
MATCH (a:Hero { id: edges.source })
MATCH (b:Hero { id: edges.target })
MERGE (a)-[r:PARLE_A]->(b)
// la partie magique, on somme les poids en chargeant
ON MATCH SET r.weight = r.weight + 1 ON CREATE SET r.weight = 1;
我们对英雄施加唯一性约束
CREATE CONSTRAINT ON (hero:Hero) ASSERT hero.id IS UNIQUE;
最终,我们得到了以下图
数据分析
角色之间交互的统计数据
MATCH (h:Hero)-[:PARLE_A]->()
WITH h, count(*) AS num
RETURN min(num) AS min, max(num) AS max, avg(num) AS avg_characters, stdev(num) AS stdev
图的直径
图的直径,也就是图中最长的最短路径
MATCH (a:Hero), (b:Hero) WHERE id(a) > id(b)
MATCH p=shortestPath((a)-[:PARLE_A*]-(b))
RETURN length(p) AS length, extract(x IN nodes(p) | x.name) AS path
ORDER BY length DESC LIMIT 5
最短路径
Dédé 和酋长之间的最短路径是什么?
MATCH (chef:Hero {name: "Le chef coutumier"}), (dede:Hero {name: "Dédé"})
MATCH p=shortestPath((chef)-[PARLE_A*]-(dede))
RETURN p
度中心性
度中心性:节点在网络中拥有的连接数量。在我们的环境中,它代表着每个角色与之交互的角色数量。我们可以使用以下纯 Cypher 代码进行计算
MATCH (c:Hero)
RETURN c.name AS Personnage, size( (c)-[:PARLE_A]-() ) AS degree
ORDER BY degree DESC
加权度中心性
我们存储了两个角色之间交互的次数,以便在关系中增加权重:权重越大,交换越多……并且关系越优先。在我们的案例中,在加载关系的 csv 文件时已经计算了聚合。
在 Cypher 中,它显示为
MATCH (h:Hero)-[t:PARLE_A]-()
RETURN h.name as hero,sum(t.weight) as weighted_degree
ORDER BY weighted_degree DESC LIMIT 10
此页面是否有用?