GraphGists

cover

介绍

创建此 GraphGist 的目的是

  • 对 neo4j 进行第一个 graphgist 测试

  • 以交互方式突出显示此漫画中角色之间的关系

已撰写 LinkedIn 文章,可在以下位置查看:https://goo.gl/dvnL3Z

brousse5 28022003

数据模型

数据模型非常简单,完全围绕着测量角色之间的交互:一个角色与另一个角色 **交谈**。

节点

  • 英雄

关系

关系模型非常简单,“一个英雄与另一个英雄交谈”。

  • 英雄 **交谈** 英雄

数据加载

我们从 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) RETURN count(h) as Nb_heros

角色之间交互的统计数据

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