原文鏈接: https://markhneedham.com/blog/2018/10/31/neo4j-graph-algorithms-visualise-projected-graph/
幾周前,我寫了一篇文章《使用加權(quán)PageRank找出史上最優(yōu)秀的網(wǎng)球運動員》,在那篇文章中,我使用了一個映射可信圖。而本文我將詳細介紹一下這個映射可信圖。
正如我在那篇文章中所指出的,大部分圖模型在進行圖算法運行時,與圖算法所期待的模型是不匹配的,所以,我們需要映射出一個新的圖,來運行圖算法。
在當前示例中,PageRank算法是運行在‘可信圖’的基礎(chǔ)上的,可信圖中每個結(jié)點的可信度依賴于傳入的關(guān)系,可信度的值則取決于這些關(guān)系上的weight屬性。
對于網(wǎng)球圖而言,開始的圖是由比賽、勝者、負者所組成,然后使用下面的語句派生出一個可信圖:
MATCH (p1)<-[:WINNER]-(match)-[:LOSER]->(p2)
RETURN id(p2) AS source, id(p1) AS target, count(*) as weight
接著,我們繼續(xù)使用費德勒和納達爾比賽的例子來看他們是如何作用的,如果我們要查詢費德勒贏的比賽的情況,只要將“費德勒”名字賦值給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
查詢結(jié)果如下:
╒════════╤════════╤════════╕
│"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
查詢結(jié)果如下:
╒════════╤════════╤════════╕
│"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
前兩行與之前查詢語句沒有什么區(qū)別,但第三行我們在兩個運動員結(jié)點之間創(chuàng)建的虛擬關(guān)系,這個語句運行之后產(chǎn)生的映射圖比較大,所以,我們先產(chǎn)生個小的的映射圖,只包含一些著名的運動員。
首先 我們創(chuàng)建一個參數(shù),僅包括那些著名的運行員。
:params players => ["Roger Federer", "Andy Murray", "Novak Djokovic", "Rafael Nadal", "Alexander Zverev", "Pete Sampras", "Andre Agassi", "John McEnroe", "Yevgeny Kafelnikov"]
接下來,我們讓這些運行員之間的比較結(jié)果可視化:
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
運行之后得到下圖:?