2017-04-22 82 views
1

我使用的Neo4j,試圖找到未連接到特定節點「a」的任何節點。我到目前爲止的查詢是:Neo4j的暗號找到兩個不相交的節點

MATCH p = shortestPath((a:Node {id:"123"})-[*]-(b:Node)) 
WHERE p IS NULL 
RETURN b.id as b 

因此,它試圖找到a和b之間的最短路徑。如果找不到路徑,則返回該節點的ID。然而,這導致我的查詢到幾分鐘運行,當它運行的內存,然後崩潰。我在想,如果這個方法會甚至工作,如果有一個更有效的方法?任何幫助將不勝感激!

編輯:

MATCH (a:Node {id:"123"})-[*]-(b:Node), 
(c:Node) 
WITH collect(b) as col, a, b, c 
WHERE a <> b AND NOT c IN col 
RETURN c.id 

所以山口(收集(b))的包含連接到每一個節點,因此,如果c是不是在COL則C是未連接到?

回答

1

其一,你給這場比賽是不可能的謂詞來滿足,所以它永遠不會發現的最短路徑。

WHERE子句與匹配,可選匹配,並且與相關的條款,所以您的查詢要求所在的路徑不存在的最短路徑。那永遠不會返回任何東西。

此外,最短路徑將在你不想要連接的節點開始,所以這沒有任何發現,沒有連接到它的節點的方式。

大概接近這種最簡單的方法就是以匹配連接到您的問題節點的所有節點,然後匹配到所有:節點檢查那些沒有在連接設置。這意味着你將不必從數據庫的每一個節點,只是一個集合中成員資格檢查做了最短路徑。

你需要APOC Procedures這一點,因爲它有一個子圖中匹配節點的最快的方法。

MATCH (a:Node {id:"123"}) 
CALL apoc.path.subgraphNodes(a, {}) YIELD node 
WITH collect(node) as subgraph 
MATCH (b:Node) 
WHERE NOT b in subgraph 
RETURN b.id as b 

編輯

你編輯的查詢可能炸燬,那將會產生巨大的結果集(查詢將在建立一個結果集從起始節點到達每個節點由一個唯一的路徑每個節點都有一個笛卡爾產品)。

取而代之的是,一步一步收集不同的節點(因爲否則,您將獲得可通過不同路徑到達的相同節點的多個節點),然後只有在收集完畢後才能開始匹配不在列表中的節點。

MATCH (:Node {id:"123"})-[*0..]-(b:Node) 
WITH collect(DISTINCT b) as col 
MATCH (a:Node) 
WHERE NOT a IN col 
RETURN a.id 
+0

謝謝!我無法使用APOC程序。這看起來是否正確嗎? (見編輯) – ThatOneGuy

+0

我編輯我的回答與應該解決您的備用查詢的查詢。請記住,Cypher支架長度可變的比賽不會像APOC的subgraphNodes高效()過程,因爲Cypher支架有興趣唯一路徑,所以這個查詢仍然可以在大圖超時。 – InverseFalcon

相關問題