簡體   English   中英

檢查密碼上先前訪問的節點

[英]Check previously visited nodes on cypher

我有一個大數據集,並且正在執行以下查詢以查找兩個節點之間的路徑:

MATCH (a:Industry{ id:140 }),(b:Industry{ id:386 })
WITH a,b
MATCH p=(a)-[:SELLS*..3]->(b)
return p

我聽說cypher做DFS,這對我來說還可以。 但是我的圖有很多循環,因此在很多情況下,例如(樹)級別3的節點與級別1的節點有連接,這會導致檢查數量超出所需。

如何在訪問節點之前檢查是否已經訪問過節點? 可能嗎?

老實說,我不知道cypher是否執行DFS-而且您也不應該知道或關心。

cypher的一大優點是它是一種聲明式圖形查詢語言。 也就是說,您告訴它想要什么數據,然后去獲取它。 您不必知道或關心如何做,隨着時間的推移,隨着查詢優化器變得越來越好,它最終將以比您本來可以更快的速度完成。 將此與命令式圖查詢進行對比,在命令式圖查詢中,您可以指定要如何獲取數據。

Cypher通常不會回溯已經結束的路徑,因為那樣效率不高,但是它可能會多次訪問某些節點,具體取決於查詢(即,是否有通向同一節點的多個路徑)。

Cypher沒有提供任何控制圖形遍歷如何發生的功能-希望您會同意我的觀點,這是一個功能,而不是錯誤。

如果您希望對圖形的遍歷方式,所看到的內容或遇到問題時的操作進行精細控制,那么我認為您需要Java Traversal API 在許多其他選項中,您可以指定BFS / DFS,還可以指定遍歷選項,例如“僅訪問每個節點一次”(無論關系指定了什么)或翻轉,“僅訪問每個關系一次”。

現在,對於您的特定查詢,如果它返回的路徑比您想要的多,也許您需要縮小查詢范圍以擺脫不想要的路徑。 您可能想要查看最長的路徑查詢 ,例如,以擺脫層次結構中的“快捷”路徑。

您還可以在Cypher中使用shortestPath() ,這是一種優化的雙向算法。 (或allShortestPaths()

例如:

MATCH (a:Industry{ id:140 }),(b:Industry{ id:386 })
MATCH p=shortestPath((a)-[:SELLS*..3]->(b))
return p

確保您具有:Industry(id)的索引/約束

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM