簡體   English   中英

Neo4j Cypher:檢查路徑中不連續節點的屬性

[英]Neo4j Cypher: check attributes of not consecutive nodes in path

我有一張圖表代表了不同城市的幾個公共汽車/火車站。 讓我們假設我想從城市A(有停止a1,a2,a3 ......)到城市Z(有停止z1,z2 ......)

節點之間有幾個路由(關系),我想獲得起始節點和結束節點之間的所有路徑。 實際上,我的成本向量將是復雜的(旅行時間和等待時間和價格以及......),因此我不能使用最短路徑等。我設法編寫了一個(非常復雜的)查詢來做我想要的:一般來說正在尋找每個匹配的開始A和結束Z可用。

我試圖通過過濾掉具有特殊特征的結果來避免循環,例如

MATCH (from{name:'a1'}), (to{name:'z1'}),
path = (from)-[:CONNECTED_TO*0..8]->(to)    
WHERE ALL(b IN NODES(path) WHERE SINGLE(c IN NODES(path) WHERE b = c))

現在我想避免不止一次訪問一個城市的可能性,例如,而不是a1 - > a2 - > d2 - > d4 - > a3 - > a4 - > z1我想得到a1-- > A4 - > Z1。

因此,我必須檢查路徑中的所有節點。 如果連續節點的n.city值相同,那么一切都很好。 但是如果我得到一條同一城市的節點不連續的路徑,例如cityA - > cityB - > cityA我想扔掉那條路。

我怎樣才能做到這一點? 有可能嗎?

我知道,這不是一個美麗的方法,但我花了很多時間尋找一個更好的方法而不丟棄整個數據結構,但我找不到一個。 它只是一個原型而Neo4j不是我的重點。 我想測試一些工具和產品來構建一些知識。 我下次會繼續采用更好的方法。

有趣的問題。 這里需要注意的重要一點是,從未重新訪問城市的路徑(離開之后)必須在城市之間的轉換少於不同城市的數量。 例如:

  • AABBC(“好”路徑)有3個不同的城市和2個過渡
  • ABBAC(“壞”路徑)也有3個不同的城市,但有3個過渡

考慮到這一點,以下查詢應該有效(即使起始節點和結束節點相同):

MATCH path = ({name:'a1'})-[:CONNECTED_TO*0..8]->({name:'z1'})
WITH path, NODES(path) as ns
WITH path, ns,
  REDUCE(s = {cnt: 0, last: ns[0].city}, x IN ns[1..] |
    CASE WHEN x.city = s.last THEN s ELSE {cnt: s.cnt+1, last: x.city} END).cnt AS nTransitions
UNWIND ns AS node
WITH path, nTransitions, COUNT(DISTINCT node.city) AS nCities
WHERE nTransitions < nCities
RETURN path;

REDUCE函數用於計算路徑中的轉換數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM