2016-09-12 61 views
0

不相關 - 跳至重要編輯。使用可選匹配的密碼NOT IN查詢

我有以下查詢:

MATCH (n) 
WHERE (n:person) AND n.id in ['af97ab48544b'] // id is our system identifier 
OPTIONAL MATCH (n)-[r:friend|connected|owner]-(m) 
WHERE (m:person OR m:dog OR m:cat) 
RETURN n,r,m 

該查詢返回所有的人,狗和貓有一個特定的人的關係。我想翻過來接收不包含在此查詢結果中的所有節點&關係。

如果它是SQL這將是

select * from graph where id NOT IN (my_query) 

我認爲可選的匹配是有問題的部分。我該怎麼做? 有什麼建議嗎?

謝謝。

- 重要編輯 -

嘿,夥計們,對不起,我的改變的問題,但我的要求已經改變。我需要讓整個圖(所有節點和關係)連接並斷開,除了特定的節點由id。下面的查詢正在工作,但僅適用於單身份證,如果更多的ID不工作。

MATCH (n) WHERE (n:person) 
OPTIONAL MATCH (n)-[r:friend|connected|owner]-(m) WHERE (m:person OR m:dog OR m:cat) 
WITH n,r,m 
MATCH (excludeNode) WHERE excludeNode.id IN ['af97ab48544b'] 
WITH n,r,m,excludeNode WHERE NOT n.id = excludeNode.id AND (NOT m.id = excludeNode.id OR m is null) 
RETURN n,m,r 

另外我想簡單查詢:

MATCH (n) WHERE (n:person) AND NOT n.id IN ['af97ab48544b'] return n 

但是這一個不返回的關係(記得我需要斷開連接的節點也)。

我怎樣才能得到整個圖排除特定節點?這包括節點和關係,連接節點以及斷開連接。

+0

要澄清,您正在尋找所有連接到您:人的節點:人/:狗/:貓連接:朋友/:連接/:所有者關係?或者你是否想要找到與這些節點之間的這些關係不存在的人?或者您是否試圖在整個圖表中找到所有不包含您的查詢中的任何人員節點(和連接的節點)的節點?什麼是期望輸出的例子? – InverseFalcon

+0

從你的SQL語句和你的問題描述中,我推斷你想找到所有'person','dog','cat'沒有連接到具有'id'的'person'? –

+0

請閱讀我最後的編輯。不幸的是我的要求已經改變。 –

回答

1

嘗試:

匹配(n),其中不n.id = 'id來除去' 可選匹配(N) - [R] - (M) 其中[不n.id」 id刪除']而不是m.id in ['id to remove'] return n,r,m

1

您必須切換查詢的'視角'...首先循環遍歷每個節點,然後修剪連接到您的人的視圖。

MATCH (bad:person) WHERE bad.id IN ['af97ab48544b'] 
WITH COLLECT(bad) AS bads 
MATCH path = (n:person) - [r:friend|:connected|:owner] -> (m) 
WHERE n._id = '' AND (m:person OR m:cat OR m:dog) AND NOT ANY(bad IN bads WHERE bad IN NODES(path)) 
RETURN path 

這就是說,這是一個比SQL更適合SQL的問題。任何時候你必須用標籤遍歷每個節點,你處於關係領域,圖表效率會降低。

+0

感謝您的快速回答,但不需要的節點仍然返回 –

+0

我稍微爲清潔編輯過,但您指的是哪些不需要的節點?它不應該返回什麼? –

+0

它返回'壞'節點本身 –