1.导入数据
在githut下载数据CSV文件:https://github.com/mathbeveridge/asoiaf/blob/master/data/asoiaf-all-edges.csv
将其保存在当前库的import文件夹
LOAD CSV WITH HEADERS FROM "file:///asoiaf-all-edges.csv" AS row MERGE (src:Character {name: row.Source}) MERGE (tgt:Character {name: row.Target}) MERGE (src)-[r:INTERACTS]->(tgt)SET r.weight = toInt(row.weight)
2. 查看《权利的游戏》图
MATCH p=(:Character)-[:INTERACTS]-(:Character)
RETURN p
LIMIT 50
3.人物数量
MATCH (c:Character) RETURN count(c)
4.概要统计
MATCH (c:Character)-[:INTERACTS]->()
WITH c, count(*) AS num
RETURN min(num) AS min, max(num) AS max, avg(num) AS avg_characters, stdev(num) AS stdev
5.图(网络)的直径
MATCH (a:Character), (b:Character) WHERE id(a) > id(b)
MATCH p=shortestPath((a)-[:INTERACTS*]-(b))
WITH length(p) AS len, p
ORDER BY len DESC LIMIT 4
RETURN len, extract(x IN nodes(p) | x) AS path
6.最短路径
MATCH (catelyn:Character {name:"Catelyn-Stark"}), (drogo:Character {name:"Drogo"})
MATCH p=shortestPath((catelyn)-[:INTERACTS*]-(drogo))
RETURN p
7.所有最短路径
MATCH (catelyn:Character {name:"Catelyn-Stark"}), (drogo:Character {name:"Drogo"})
MATCH p=allShortestPaths((catelyn)-[:INTERACTS*]-(drogo))
RETURN p
8.关键节点
如果一个节点位于其它两个节点所有的最短路径上,即称为关键节点。下面我们找出网络中所有的关键节点:
MATCH (a:Character), (b:Character) WHERE id(a) > id(b)
MATCH p=allShortestPaths((a)-[:INTERACTS*]-(b)) WITH collect(p) AS paths, a, b
UNWIND nodes(head(paths)) as c // first path
WITH * WHERE NOT c IN [a,b] AND all(path IN tail(paths) WHERE c IN nodes(path))
RETURN a.name, b.name, c.name AS PivotalNode, length(head(paths)) as pathLength, length(paths) as pathCount SKIP 490 LIMIT 10
拿"Eustace-Brune"和"Cressen"校验,查看两个节点的最短路径,看到结果刚好就是"Dick-Crabb"和"Renly-Baratheon":
MATCH (a:Character {name: "Eustace-Brune"}), (b:Character {name: "Cressen"})
MATCH p=allShortestPaths((a)-[:INTERACTS*]-(b))
RETURN p