2017-01-23 124 views

回答

3

查找最長路徑的圖算法未實現。

這裏是一個暗號查詢得到的所有路徑和大小對其進行排序:

// get the nodes 
MATCH (a:Node), (b:Node) 
WHERE ID(a) = 14 AND ID(b) = 7 
WITH a,b 
// match all paths 
MATCH p=(a)-[*]-(b) 
// return the longest 
RETURN p, length(p) ORDER BY length(p) DESC LIMIT 1 

然而,如果沒有對查詢任何限制,這可能不是大圖工作。在無向圖中查找最長路徑很昂貴:https://en.wikipedia.org/wiki/Longest_path_problem

而且對查詢(方向和關係類型)沒有限制,查詢將查找所有無向路徑。

你應該限制你的路徑查詢或嘗試兩個解決你的問題沒有最長的路徑。

+0

我嘗試沒有任何限制,因爲我們的topolgy很大,所以它會無限循環。 – raj

+1

計算最長路徑只適用於有向無環圖。在無向循環圖中,最長的路徑可能是無限的(請參閱您的帖子的評論)。不幸的是,圖論不允許你想要做什麼。 –

0

如果您正在尋找其中鏈中的每個節點到下一個相同的關係節點之間的最長路徑,然後看到Achieving longestPath Using Cypher表示:

MATCH p=(parent:Entity)-[:HAS_CHILD*1..10]->(child:Person) 
WHERE size((child)-[:HAS_CHILD]->()) = 0 
RETURN child; 

但是我使用:

MATCH (parent:Entity)-[:HAS_CHILD*1..10]->(child:Person) 
WHERE NOT (child)-[r:HAS_CHILD]->() 
RETURN child; 

如果任何人都可以評論表現或任何其他方面,請做!

我還發現了一個未公開的特性,這將還給孩子的時候它也是父(如只有一個節點):

MATCH (parent:Entity)-[:HAS_CHILD*0..]->(child:Person) 
WHERE NOT (child)-[r:HAS_CHILD]->() 
RETURN child;