目錄
數(shù)據(jù)源
查詢兩節(jié)點有效的路徑
所有路徑(不準確)
有效路徑(準確)
查詢兩節(jié)點之間最短路徑
查詢兩節(jié)點之間所有的最短路徑
數(shù)據(jù)源
查詢兩節(jié)點有效的路徑
路徑長度(5個節(jié)點之內),一般都會做限制,否則數(shù)據(jù)庫一但內容過多就會卡死
所有路徑(不準確)
最容易想到的就是這樣寫,但是結果是不準確的。
match p = (a)-[r*..5]-(b)
where a.name = '劉備' and b.name='劉禪'
return p
為什么不準確?
可以看到,劉禪與關羽、張飛、糜夫人、糜芳、糜竺? 關系不是很大,因為他們是劉備的關系群
那為何還是能搜到呢?
因為我們設置了最大路徑是5
因此張飛出現(xiàn)的原因就是這樣的路徑
劉備-張飛-劉備-劉禪
劉備-張飛-關羽-劉備-劉禪
可以看到,劉備(目標節(jié)點)在一條路徑中出現(xiàn)了兩次,所以導致一些不相關的節(jié)點出現(xiàn)了,其他節(jié)點(糜夫人、糜芳、糜竺)也是類似問題。
問題驗證
我們可以把每條路徑中的節(jié)點名稱抽取出來看看
match p = (a)-[r*..5]-(b)
where a.name = '劉備' and b.name='劉禪'
return extract(n in nodes(p)| n.name)
與我們想的結果一致
如何解決這個問題?
問題就是在一條路徑(p)中,有重復人員的出現(xiàn)
那么解決方案就是,去掉路徑(p)中有重復人員的路徑(p)
// 相當于遍歷nodes, 每得到一個node就在nodes中找一下他自己有幾個,如果不等于1就不要了
and ALL( n1 in nodes(p) where size(filter(n2 in nodes(p) where id(n1) = id(n2)))=1 )
// 新版本neo4j 不支持fliter函數(shù) 用[]代替
and ALL( n1 in nodes(p) where size([n2 in nodes(p) where id(n1) = id(n2)])=1 )
有效路徑(準確)
最終方案
match p = (a)-[r*..5]-(b)
where a.name = '劉備' and b.name='劉禪'
and ALL( n1 in nodes(p) where size(filter(n2 in nodes(p) where id(n1) = id(n2)))=1 )
return p
// 新版
match p = (a)-[r*..5]-(b)
where a.name = '劉備' and b.name='劉禪'
and ALL( n1 in nodes(p) where size([n2 in nodes(p) where id(n1) = id(n2)])=1 )
return p
查詢兩節(jié)點之間最短路徑
// TODO 還可以設置最短路徑權重
match p = shortestpath((a)-[r*0..4]-(b))
where a.name = '劉備' and b.name='劉禪'
return p
查詢兩節(jié)點之間所有的最短路徑
最短路徑如果不加權重的話,不如用所有最短路徑,因為你沒有規(guī)定最短路徑的含義。文章來源:http://www.zghlxwxcb.cn/news/detail-410399.html
這個也經常用,但是如果梳理兩個節(jié)點關系的時候 這樣寫會漏掉長的路徑,導致結果不完全。文章來源地址http://www.zghlxwxcb.cn/news/detail-410399.html
match p = allshortestpaths((a)-[r*0..4]-(b))
where a.name = '劉備' and b.name='劉禪'
return p
到了這里,關于neo4j查詢兩節(jié)點之間所有路徑/關系的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!