Graph de la Brousse En Folie, tome V

引言
创建此 GraphGist 的目的是为了
-
使用 Neo4j 进行 GraphGist 的首次测试
-
以交互方式突出显示此漫画书人物之间的关系
一篇 LinkedIn 文章已撰写完成,可在此处查看:https://goo.gl/dvnL3Z

数据模型
数据模型非常简单,完全侧重于衡量人物之间的互动:一个人物 PARLE_A(与…对话)另一个人物。
节点
-
英雄
关系
关系模型非常简单,“一个英雄与另一个英雄对话”
-
Hero PARLE_A Hero
数据加载
我们从 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
此页面有帮助吗?