2016-12-06 61 views
0

因此,我從關係數據庫中創建了Neo4j圖數據庫。圖形數據庫有大約700萬個節點和大約900萬個節點之間的關係。快速搜索大neo4j圖中的未連接節點

我現在想找到所有節點,沒有連接到具有某個標籤的節點(讓我們稱它們爲未連接的節點)。例如,我有標籤爲「Customer」和「Order」的節點(我們稱之爲頂級節點)。我想查找所有與這些頂級節點沒有關係的節點。關係不一定是直接的,節點可以通過其他節點連接到頂層節點。

我有這將解決這個問題的一個暗號查詢:

MATCH (a) WHERE not ((a)-[*]-(:Customer)) AND not ((a)-[*]-(:Order)) RETURN a; 

正如你可以想像,查詢將需要很長的時間來執行,性能不錯。很可能是因爲無關的關係,並且因爲通過多少節點可以建立關係並不重要。但是,關係方向並不重要,我需要確保沒有從任何節點到頂級節點之一的路徑。

有什麼方法可以更快找到未連接的節點?請注意,數據庫非常大,並且有超過2個標記頂級節點的標籤。

回答

0

您可以嘗試此方法,該方法涉及更多操作,但可以分批運行以獲得更好的性能(請參閱APOC過程庫中的apoc.periodic.commit())。

這個想法是首先對圖中的所有節點應用一個標籤(比如:Unconnected)(批量執行apoc.periodic.commit),然後,使用該標籤對多個頂級節點進行批量匹配子圖中的所有節點都從它們延伸並刪除該標籤。

當您最終用盡了未連接標籤(意味着所有頂級節點及其子圖不再具有此標籤)時,最終用完了頂級節點,那麼圖中剩餘的具有:未連接標籤的唯一節點未連接到您的頂級節點。

這種操作的任何方法都可能會很慢,但優點是可以批量處理,如果中斷,您可以繼續。一旦您的查詢完成,所有相關的未連接節點現在標記爲您方便進一步處理。另外,在Neo4j無向關係中最後一個音符在語法() - [*] - ()中沒有箭頭。

+0

非常感謝你,我覺得這是一個很好的解決方案。我想嘗試一種類似的方法,即刪除連接到頂級節點的所有節點,只留下圖中未連接的節點。你的方法雖然好得多。 另外,感謝您提及APOC程序,我不知道可以通過Cypher直接批量運行操作。 並感謝您的語法更正,我會編輯它。 我會嘗試這種方法,並在完成後給予反饋。 –

0
MATCH (a) 
WHERE 
not (a:Customer OR a:Order) 
AND shortestPath((a)-[*]-(:Customer)) IS NULL 
AND shortestPath((a)-[*]-(:Order)) IS NULL 
RETURN a; 

如果你可以添加rel-types,它會更快。 進一步的優化可能是檢查:Order節點的Customer路徑的節點,反之亦然。即

NONE(n in nodes(path) WHERE n:Order)

通常,這可能是相當的一組操作,即 擴大圍繞平行所有訂單和客戶節點爲兩個集合 並計算這兩組之間的重疊。

然後從總節點數中刪除重疊。

我增加了一個問題,對於APOC此處添加這樣一個函數或過程

https://github.com/neo4j-contrib/neo4j-apoc-procedures/issues/223

+0

查詢中有錯誤。 shortestPath()需要節點名稱。關於rel-types,我不能使用任何rel-types,因爲它們對我的用例無關緊要。 我不確定你的意思是檢查路徑和刪除重疊等。你能詳細說明一下嗎?據我瞭解,你建議從一個:Order節點開始,並檢查連接的節點:Customer節點?反之亦然,對於所有其他訂單和客戶節點呢?那會是什麼用途呢?我能做些什麼來產生重疊? –