2015-06-08 57 views
2

我修改了'vanilla'初始查詢this console,並在'Morpheus'和'Cypher'節點之間添加了一個關係類型'LOCKED'。如何消除路徑之外存在關係的路徑,但路徑中的節點之間存在關係?

如何修改現有的(首次運行)查詢,這是一個可變長度路徑,以便由於我添加的額外鎖定關係而不再到達代理Smith節點?

首輪查詢:

MATCH (n:Crew)-[r:KNOWS|LOVES*2..4]->m 
WHERE n.name='Neo' 
RETURN n AS Neo,r,m 

我已經試過這樣的事情:

MATCH p=(n:Crew)-[r:KNOWS|LOVES*2..4]->m 
WHERE n.name='Neo' 
AND none(rel IN rels(p) WHERE EXISTS (StartNode(rel)-[:LOCKED]->EndNode(rel))) 
RETURN n AS Neo,r,m 

..但它不承認無()函數內的格局。

我使用社區2.2.1

感謝您閱讀

回答

3

我敢肯定你不能在那樣的MATCH Y型子句中使用的功能(儘管它很聰明)。那這個呢?

MATCH path=(neo:Crew)-[r:KNOWS|LOVES|LOCKED*2..4]->m 
WHERE neo.name='Neo' 
AND NOT('LOCKED' IN rels(path)) 
RETURN neo,r,m 

編輯:

哎呀,看起來像戴夫可能會打我一拳。這是我想出的解決方案;)

MATCH p=(neo:Crew)-[r:KNOWS|LOVES*2..4]->m 
WHERE neo.name='Neo' 
WITH p, neo, m 
UNWIND rels(p) AS rel 
MATCH (a)-[rel]->(b) 
OPTIONAL MATCH a-[locked_rel:LOCKED]->b 
WITH neo, m, collect(locked_rel) AS locked_rels 
WHERE none(locked_rel IN locked_rels WHERE()-[locked_rel]->()) 
RETURN neo, m 
+1

Hrm,我正在實現你想要的是找到既知道'LOVES'和'LOCKED'並排除這些路徑的鏈接......我會重新考慮 –

+0

如果在函數中使用了那個函數在MATCH行之後的WHERE子句中,它似乎識別它自己的WHERE子句中的明顯模式,但在嘗試像上面那樣使用StartNode(rel)之類的「指針」時會下降。 編譯器有與此例如沒有問題: MATCH(N:船員) - [R:KNOWS | LOVES * 2..4] - >米 WHERE n.name = '新' AND NONE(相對IN r WHERE Exists((n) - [:LOCKED] - >(m))) RETURN n AS Neo,r,m ...雖然,那永遠不會做我想做的事。 – user157109

+0

好的,檢查一下 –

2

好吧,這是有點複雜,但我認爲它的工作原理。該方法是採取所有路徑並找到最後已知的好節點(那些有LOCKED關係的節點將它們留下)。然後使用該節點作爲新的終點並返回路徑。

match p=(n:Crew)-[r:KNOWS|LOVES|LOCKED*2..4]->m 
where n.name='Neo' 
with n, relationships(p) as rels 
unwind rels as r 
with n 
, case 
    when type(r) = 'LOCKED' then startNode(r) 
    else null 
end as last_good_node 
with n 
, (collect(distinct last_good_node)) as last_good_nodes 
unwind last_good_nodes as g 
match p=n-[r:KNOWS|LOVES*]->g 
return p 

我認爲這將是簡單的,如果有一個locked: true財產上KNOWSLOVES關係。

+1

要有一個關係的屬性,你可能會把它放在兩者上,因爲兩者都可以存在。這似乎有點凌亂 –

+0

是的 - 同意 - 猜測它只是移動它們問題 –

+0

我還沒有嘗試過你的答案但戴夫,它看起來應該爲演示圖工作,但是當應用到也許更大的圖不'第二個MATCH有可能選擇一個不同於原始節點的路由,而節點對之間有一個LOCKED關係? – user157109

相關問題