2016-12-23 141 views
5

我有一張圖表,代表了幾個在不同城市的公交車/火車站。 假設我想從城市A(帶站點a1,a2,a3 ...)到城市Z(帶有站點z1,z2 ...)Neo4j Cypher:檢查路徑中不連續節點的屬性

假設我們要從城市A我想要得到全部路徑在開始和結束節點之間。我的成本向量在實際中會很複雜(旅行時間和等待時間以及價格和...),因此我不能使用最短路徑等。我設法編寫了一個(非常複雜)的查詢,以實現我想要的:通常它正在尋找可用的開始A和結束Z的每場比賽。

我儘量避免通過篩選出具有特殊特徵的結果來循環, G。

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)) 

現在我想避免可能訪問一個城市不止一次, G。而不是a1→a2→d2→d4→a3→a4→z1我想得到a1→a4→z1。

因此我必須檢查路徑中的所有節點。如果連續節點的n.city值相同,則一切正常。但是如果我得到了一個與同一城市不連續的節點的路徑, G。 cityA - > cityB - > cityA我想扔掉那條路。

我該怎麼做?有可能嗎?

我知道,這是不是真的一個美麗的方法,但我投入了相當多的時間在尋找一個更好的一個沒有丟掉整個數據結構,但我找不到一個。它只是一個原型,Neo4j不是我的焦點。我想測試一些工具和產品來建立一些知識。下次我會繼續採取更好的方法。

回答

1

有趣的問題。在這裏觀察重要的是,從來沒有重溫一個城市(離開之後)的路徑必須有城市比不同的城市數量少之間的轉換。例如:

  • 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功能是用來計算轉換的數量 一條路徑。

+0

這是個好主意!它按預期工作。現在我只需要整合我的其他陳述。如果我遇到問題,我會再寫。非常感謝! – Stefan