验证从湖北省出发,到达中国任何一个省市,最多需要经过2个省
这是各省相邻的省份的数据(数据来源于微信公众号:让技术一瓜共食),如下:
北京市:河北省、天津市
天津市:北京市、河北省
上海市:浙江省、江苏省
重庆市:四川省、贵州省、陕西省、湖北省、湖南省
河北省:山东省、河南省、山西省、内蒙古自治区、辽宁省、天津市、北京市
山西省:内蒙古自治区、陕西省、河南省、河北省
辽宁省:吉林省、内蒙古自治区、河北省
吉林省:内蒙古自治区、辽宁省、黑龙江省
黑龙江省:吉林省、内蒙古自治区
江苏省:山东省、安徽省、浙江省、上海市
浙江省:江苏省、安徽省、上海市、江西省、福建省
安徽省:山东省、江苏省、浙江省、江西省、湖北省、河南省
福建省:浙江省、江西省、山东省
江西省:安徽省、浙江省、福建省、广东省、湖南省、湖北省
山东省:河北省、河南省、安徽省、江苏省
河南省:河北省、山东省、江苏省、安徽省、湖北省、陕西省、山西省
湖北省:河南省、安徽省、江西省、湖南省、重庆市、陕西省
湖南省:湖北省、江西省、广东省、广西壮族自治区、贵州省、重庆市
广东省:福建省、江西省、湖南省、广西壮族自治区、海南省、香港市、澳门市
海南省:广东省
四川省:青海省、甘肃省、陕西省、重庆市、贵州省、云南省、新疆维吾尔自治区、西藏自治区
贵州省:四川省、重庆市、湖南省、广西壮族自治区、云南省
云南省:西藏自治区、四川省、贵州省、广西壮族自治区
陕西省:内蒙古自治区、河南省、湖北省、重庆市、四川省、甘肃省、宁夏回族自治区、山西省
甘肃省:内蒙古自治区、宁夏回族自治区、陕西省、四川省、青海省、新疆维吾尔自治区
青海省:新疆维吾尔自治区、甘肃省、四川省、西藏自治区
内蒙古自治区:甘肃省、宁夏回族自治区、陕西省、山西省、河北省、辽宁省、吉林省、黑龙江省
广西壮族自治区:云南省、贵州省、湖南省、广东省
西藏自治区:新疆维吾尔自治区、青海省、四川省、云南省
宁夏回族自治区:内蒙古自治区、陕西省、甘肃省
新疆维吾尔自治区:甘肃省、青海省、西藏自治区
香港市:广东省
澳门市:广东省
用python将代码整理成点数据和关系数据(python代码不展示),导入neo,并计算从湖北出发,到达所有省份的最短路径
下面是查询的Cypher代码:
//添加约束
create constraint on (n:Province)
assert n.Name is unique;
//导入node
with "file:///province_nodes.csv" as uri
load csv with headers from uri as row
merge (name:Province {Name:row.name});
//导入edge
with "file:///province_realtionship.csv" as uri
load csv with headers from uri as row
match (origin:Province {Name:row.name1})
match (destination:Province {Name:row.name2})
merge (origin)-[:相邻]-(destination);
//查询从湖北出发到达各省的最短路径
//使用的neo4j的算法包shortestPath
//也可以直接使用单源最短路径算法algo.shortestPath.deltaStepping
match (n:Province)
with collect(n) as all_nodes
unwind all_nodes as dest
match (source:Province {Name:"湖北省"}),(destination:Province {Name:dest.Name})
call algo.shortestPath.stream(source,destination,null)
yield nodeId,cost
return dest.Name as destination,collect(algo.getNodeById(nodeId).Name) as via,toInteger(collect(cost)[-1]) as costs
order by costs desc
结果如下(neo4j 只能插入有向图,但是在查询计算的时候不考虑方向,当做无向图就可以,不影响计算):
destination | via | costs |
黑龙江省 | [湖北省,陕西省,内蒙古自治区,黑龙江省] | 3 |
海南省 | [湖北省,江西省,广东省,海南省] | 3 |
云南省 | [湖北省,重庆市,四川省,云南省] | 3 |
青海省 | [湖北省,重庆市,四川省,青海省] | 3 |
西藏自治区 | [湖北省,重庆市,四川省,西藏自治区] | 3 |
新疆维吾尔自治区 | [湖北省,重庆市,四川省,新疆维吾尔自治区] | 3 |
香港市 | [湖北省,江西省,广东省,香港市] | 3 |
澳门市 | [湖北省,江西省,广东省,澳门市] | 3 |
北京市 | [湖北省,河南省,河北省,北京市] | 3 |
天津市 | [湖北省,河南省,河北省,天津市] | 3 |
上海市 | [湖北省,安徽省,江苏省,上海市] | 3 |
辽宁省 | [湖北省,河南省,河北省,辽宁省] | 3 |
吉林省 | [湖北省,陕西省,内蒙古自治区,吉林省] | 3 |
江苏省 | [湖北省,安徽省,江苏省] | 2 |
浙江省 | [湖北省,安徽省,浙江省] | 2 |
福建省 | [湖北省,江西省,福建省] | 2 |
山东省 | [湖北省,安徽省,山东省] | 2 |
广东省 | [湖北省,江西省,广东省] | 2 |
四川省 | [湖北省,重庆市,四川省] | 2 |
贵州省 | [湖北省,重庆市,贵州省] | 2 |
甘肃省 | [湖北省,陕西省,甘肃省] | 2 |
内蒙古自治区 | [湖北省,陕西省,内蒙古自治区] | 2 |
广西壮族自治区 | [湖北省,湖南省,广西壮族自治区] | 2 |
宁夏回族自治区 | [湖北省,陕西省,宁夏回族自治区] | 2 |
河北省 | [湖北省,河南省,河北省] | 2 |
山西省 | [湖北省,陕西省,山西省] | 2 |
安徽省 | [湖北省,安徽省] | 1 |
江西省 | [湖北省,江西省] | 1 |
河南省 | [湖北省,河南省] | 1 |
湖南省 | [湖北省,湖南省] | 1 |
陕西省 | [湖北省,陕西省] | 1 |
重庆市 | [湖北省,重庆市] | 1 |