neo4j只有4版本以后支持,gds版本为1.3.x以上支持
1、中介/中间中心性
中介中心性指的是一个结点担任其它两个结点之间最短路的桥梁的次数。一个结点充当“中介”的次数越高,它的中介中心度就越大。如果要考虑标准化的问题,可以用一个结点承担最短路桥梁的次数除以所有的路径数量。
这个有点像是我们身边那种社交达人,我们认识的不少朋友可能都是通过他/她认识的,这个人起到了中介的作用。
创建数据:
CREATE
(alice:User {name: 'Alice'}),
(bob:User {name: 'Bob'}),
(carol:User {name: 'Carol'}),
(dan:User {name: 'Dan'}),
(eve:User {name: 'Eve'}),
(frank:User {name: 'Frank'}),
(gale:User {name: 'Gale'}),
(alice)-[:FOLLOW]->(carol),
(bob)-[:FOLLOW]->(carol),
(carol)-[:FOLLOW]->(dan),
(carol)-[:FOLLOW]->(eve),
(dan)-[:FOLLOW]->(frank),
(eve)-[:FOLLOW]->(frank),
(frank)-[:FOLLOW]->(gale);
CALL gds.graph.create('myGraph', 'User', 'FOLLOW');
CALL gds.betweenness.stream('myGraph')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score
ORDER BY name ASC
2、接近中心度算法
比如你要建一个大型的娱乐商场,你可能会希望周围的顾客到达这个商场的距离都可以尽可能地短。这个就涉及到接近中心性的概念,接近中心性的值为路径长度的倒数,接近中心性需要考量每个结点到其它结点的最短路的平均长度。也就是说,对于一个结点而言,它距离其它结点越近,那么它的中心度越高。
CREATE (a:Node{id:"A"}),
(b:Node{id:"B"}),
(c:Node{id:"C"}),
(d:Node{id:"D"}),
(e:Node{id:"E"}),
(a)-[:LINK]->(b),
(b)-[:LINK]->(a),
(b)-[:LINK]->(c),
(c)-[:LINK]->(b),
(c)-[:LINK]->(d),
(d)-[:LINK]->(c),
(d)-[:LINK]->(e),
(e)-[:LINK]->(d);
CALL gds.alpha.closeness.stream({
nodeProjection: 'Node',
relationshipProjection: 'LINK'
})
YIELD nodeId, centrality
RETURN gds.util.asNode(nodeId).id AS user, centrality
ORDER BY centrality DESC;