驗證從湖北省出發,到達中國任何一個省市,最多需要經過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 |