2017-07-18 43 views
2

我有3個標籤,A,B和Z.A & B都與Z有關係。我想查找所有A節點沒有任何共享任何節點Z與BCypher查詢其中2個不同標籤不包含與第3個標籤/節點的關係

目前,做一個正常的查詢,其中存在的關係DOES,工作。

MATCH (a:A)-[:rel1]->(z:Z)<-[:rel2]-(b:B { uuid: {<SOME ID>} }) 
RETURN DISTINCT a 

但是當我做

MATCH (a:A) 
WHERE NOT (a)-[:rel1]->(z:Z)<-[:rel2]-(b:B { uuid: {<SOME ID>} })) 
RETURN DISTINCT a 

它拋出一個錯誤

Neo4j::Server::CypherResponse::ResponseError: z not defined 

不知道這樣做的語法不正確,我試過WHERE NOT EXIST()但沒有運氣。

查詢是一個較大的一個通過使用neo4jrb /(Neo4j的:: Session.query)一個Rails應用程序

回答

4

這是一個與您的查詢範圍有關的問題。當你形容一個節點像一個MATCH條款如下

MATCH (n:SomeLabel) 

你告訴暗號來尋找與標籤SomeLabel一個節點,它在查詢的其餘部分分配給變量n,並在查詢結束時,您可以使用RETURN n返回存儲在此節點中的值(除非您通過在WITH子句中不包括它而刪除n)。

後來在你查詢,如果你想MATCH另一個節點,你可以參考這樣做是爲了n,因此,例如:

MATCH (m:SomeOtherLabel)-[:SOME_RELATIONSHIP]-(n) 

將連接一個變量(在任何方向)匹配到節點n,標籤爲SomeOtherLabel,並將其分配給變量m以進行查詢的其餘部分。

只能分配給這樣的變量節點MATCHOPTIONAL MATCHMERGECREATEWITHUNWIND條款(在某種程度上)(這裏有人糾正我,如果我錯過了一個,我想你也爲此在列表解析和FOREACH條款)。

在第二個查詢中,您試圖找到標籤爲A的節點,該節點未連接到標籤爲Z的節點。但是,寫入查詢的方式意味着您實際上在說找到標籤爲A的節點,該節點未通過rel1關係連接到存儲爲z的節點。這將失敗(並且如圖所示,neo抱怨z沒有被定義),因爲你不能在WHERE子句中創建像這樣的新變量。

要糾正錯誤,您需要刪除對變量z的引用,並確保您也已經在WHERE子句之前定義了包含您的節點的變量b。現在,您在查詢中保留標籤,如下所示。

MATCH (a:A) 
MATCH (b:B { uuid: {<SOME ID>} }) 
WHERE NOT (a)-[:rel1]->(:Z)<-[:rel2]-(b) // changed this line 
RETURN DISTINCT a 

而且有一點運氣,現在就可以工作了。

+0

謝謝,這工作完美!對於Cypher/Neo4j還是比較新的。試圖加快由於循環和過度使用neo4jrb的ActiveNode調用而導致的報告。 在上面的相反的一面,我有一個查詢來獲得A和B的關係映射到Z匹配的位置。很簡單。我將如何結合一個查詢來找回他們匹配的Z的集合和剩下的不匹配的Z的另一個集合?如果當前正在查詢以獲得匹配的rels是... MATCH(a:A) - [:rel1] - >(z:Z)< - [:rel2] - (:B {uuid:{ }}) RETURN DISTINCT a,collect({match:z.title}) – ndyr

2

你得到錯誤叫的一部分,因爲z是一個節點的標識,正在使用您尚未識別的where子句。

既然你知道b已經我會匹配它,然後在你的where子句中使用它。您不需要指定:Z的標識符,只需使用節點標籤即可。

MATCH (b:B { uuid: {<SOME ID>} }) 
WITH b 
MATCH (a:A) 
WHERE NOT (a)-[:rel1]->(:Z)<-[:rel2]-(b) 
RETURN DISTINCT a 
相關問題