Neo4j图形算法:可视化映射图
原文链接: https://markhneedham.com/blog/2018/10/31/neo4j-graph-algorithms-visualise-projected-graph/
几周前,我写了一篇文章《使用加权PageRank找出史上最优秀的网球运动员》,在那篇文章中,我使用了一个映射可信图。而本文我将详细介绍一下这个映射可信图。
正如我在那篇文章中所指出的,大部分图模型在进行图算法运行时,与图算法所期待的模型是不匹配的,所以,我们需要映射出一个新的图,来运行图算法。
在当前示例中,PageRank算法是运行在‘可信图’的基础上的,可信图中每个结点的可信度依赖于传入的关系,可信度的值则取决于这些关系上的weight属性。
对于网球图而言,开始的图是由比赛、胜者、负者所组成,然后使用下面的语句派生出一个可信图:
MATCH (p1)<-[:WINNER]-(match)-[:LOSER]->(p2)
RETURN id(p2) AS source, id(p1) AS target, count(*) as weight
接着,我们继续使用费德勒和纳达尔比赛的例子来看他们是如何作用的,如果我们要查询费德勒赢的比赛的情况,只要将“费德勒”名字赋值给p1,“纳达尔"赋值给p2,查询语句如下:
MATCH (p1:Player {name: "Roger Federer"})<-[:WINNER]-(match)-[:LOSER]->(p2:Player {name: "Rafael Nadal"})
RETURN id(p2) AS source, id(p1) AS target, count(*) as weight
查询结果如下:
╒════════╤════════╤════════╕
│"source"│"target"│"weight"│
╞════════╪════════╪════════╡
│7 │124 │15 │
└────────┴────────┴────────┘
如果想得到纳达尔赢得比赛的情况:
MATCH (p1:Player {name: "Rafael Nadal"})<-[:WINNER]-(match)-[:LOSER]->(p2:Player {name: "Roger Federer"})
RETURN id(p2) AS source, id(p1) AS target, count(*) as weight
查询结果如下:
╒════════╤════════╤════════╕
│"source"│"target"│"weight"│
╞════════╪════════╪════════╡
│124 │7 │23 │
└────────┴────────┴────────┘
可视化这个映射图之后就很容易理解了。我们可以使用APOC库中的方法来进行可视化映射图。
看下面的查询语句:
MATCH (p1)<-[:WINNER]-(match)-[:LOSER]->(p2)
WITH p2, p1, count(*) AS count
CALL apoc.create.vRelationship(p2,"BEATEN_BY",{count:count},p1) yield rel
RETURN p2, p1, rel
前两行与之前查询语句没有什么区别,但第三行我们在两个运动员结点之间创建的虚拟关系,这个语句运行之后产生的映射图比较大,所以,我们先产生个小的的映射图,只包含一些著名的运动员。
首先 我们创建一个参数,仅包括那些著名的运行员。
:params players => ["Roger Federer", "Andy Murray", "Novak Djokovic", "Rafael Nadal", "Alexander Zverev", "Pete Sampras", "Andre Agassi", "John McEnroe", "Yevgeny Kafelnikov"]
接下来,我们让这些运行员之间的比较结果可视化:
MATCH (p1)<-[:WINNER]-(match)-[:LOSER]->(p2)
WHERE p1.name in $players AND p2.name IN $players
WITH p2, p1, count(*) AS count
CALL apoc.create.vRelationship(p2,"BEATEN_BY",{count:count},p1) yield rel
RETURN p2, p1, rel
运行之后得到下图: