2014-04-10 173 views
1

我想找到兩個節點之間的最短路徑,但我需要從路徑中排除一些節點。我正在嘗試的密碼是Neo4j遍歷排除節點

START a=node(1), b=node(2), c=node(3,4) 
MATCH p=a-[rel:RELATIONSHIP*]-b 
WHERE NOT (c in nodes(p)) 
RETURN p 
ORDER BY length(p) LIMIT 1 

但是,這給了我一個包含c中的節點之一的路徑。

有沒有辦法做一個遍歷排除一些節點?

感謝

回答

2

MATCH ... WHERE部分應該被罰款,但你START條款可能不會做你所期望的。執行以下操作,並考慮結果

START a=node(1), b=node(2), c=node(3,4) 
RETURN ID(a), ID(b), ID(c) 

你回來

==> +-----------------------+ 
==> | ID(a) | ID(b) | ID(c) | 
==> +-----------------------+ 
==> | 1  | 2  | 3  | 
==> | 1  | 2  | 4  | 
==> +-----------------------+ 

這意味着查詢的其餘部分被執行兩次,一次不包括路徑(3),一旦排除(4)。但是,這也意味着它會運行一次而不是,不包括它們中的每一個,這意味着您確實可以獲得路徑中存在的那些節點的結果。

如果要從路徑中排除這兩個節點,請嘗試收集這些節點並使用NONENOT ANY或類似方法進行篩選。我認爲像這樣應該做到這一點(目前無法測試)。

START a=node(1), b=node(2), c=node(3,4) 
WITH a, b, collect (c) as cc 
MATCH p=a-[rel:RELATIONSHIP*]-b 
WHERE NONE (n IN nodes(p) WHERE n IN cc) 
RETURN p 
ORDER BY length(p) LIMIT 1 
+0

謝謝。這工作完美。我不會在很長時間內發現START條款問題。 – rorymadden