2017-03-07 111 views
0

我有一個存儲在Neo4j中的嵌套樹。每個節點可以與其他節點有(n)-[:CHILD]->(c)關係。允許您使用MATCH (n)-[c:CHILD*]-(m)從給定節點查詢整個樹。通過嵌套層次結構存儲用戶遍歷路徑

我有,是搞清楚如何存儲路徑,用戶需要爲他們走過一棵樹什麼麻煩。例如,返回路徑的查詢將是(user)-[:USER_PATH*]->(node)

但是路徑必須保持沿:CHILD關係的線條,它不能跳的分支之外。用戶路徑不能從一個分支的葉子跳到另一個分支的葉子,而不是先回縮它的路徑,直到它找到一個分叉到它。

此外,我不認爲最短路徑,將工作,因爲它不是我想要的最短路徑,我希望用戶實際路徑。但它應該忽視用戶退出任何分支機構時放棄的關係。它不應該離開死路。

我怎麼能每個節點走到後更新圖表,所以這些規則留在機智?

可以假定,在向下鑽取一個新的分支,它只能通過一步一個多組兄弟姐妹。然而,它所經過的所有分支仍然是開放的,因此可以選擇他們的兄弟姐妹。

最好的我可以計算的是,它需要:只要能

  • 「喜歡」走:USER_PATH關係
  • ,直到它需要打破這條道路才能到新節點
  • 此時它創建任何新的關係
  • 然後刪除任何舊的關係不再是路徑上

我不知道如何做到這一點。

我花了大量的時間在試錯法和谷歌搜索無濟於事。

在此先感謝!


按照下面提供的圖像:

  • 紅色節點=用戶
  • 綠色節點= A有效的節點成爲新的 「目標」
  • 藍色節點=無效目標節點

因此,如果您要退出當前的葉節點,它會刪除鏈中的最後一個:RATIONAL_PATH關係。

另外的路徑應該調整到任何被選中的綠色節點,但保持現有的:RATIONAL_PATH機智爲儘可能。

enter image description here

+0

對於RATIONAL_PATH關係應該是什麼路徑,或者應該如何生成RATIONAL_PATH關係,我還是比較模糊......這些個別關系是由其他某種過程選擇的嗎?或者你是否試圖從「MATCH(n) - [c:CHILD *] - (m)'種類的查詢中推斷它們? – InverseFalcon

+0

這聽起來像是你想要的最終結果是單個路徑:RATIONAL_PATH關係到某個最終節點,並且你想要一種方式來清理用戶探索但返回的路徑。那是你的追求?我假設退出過程將創建:RATIONAL_PATH關係的方向返回到前面的節點(與它們來自的方向相反)。你想在什麼時候嘗試清理無關路徑? – InverseFalcon

+0

是,單個:從根節點到樹中某個節點的RATIONAL_PATH路徑。但是,當他們導航時,我不想回到相反的方向,而是想刪除這個關係,以便提供從根到目標的單向路徑節點,我寧願刪除那個距離太遠的關係開始。 –

回答

0

我個人認爲,刪除現有路徑,並創建一個新的與shortestPath()可能是最好的一段路要走。重複使用現有路徑和執行清理的成本通常會比簡單重新開始更高更復雜。

否則,採取的方法將是匹配到路徑的最後一個節點,然後執行shortestPath()到新節點,並創建您的路徑。我們不得不執行清理。這可能涉及匹配所有路徑:RATIONAL_PATH關係到結束節點導致一組路徑。距離最短的那個將成爲我們保留的那個。我們需要收集這些關係,收集不再有效的其他路徑的其他關係,做一些減法運算以獲得最短路徑中未使用的關係,並刪除它們。

這應該是可以避免的一些工作。

+0

現在我基本上只是:匹配根;完全刪除該節點的所有RATIONAL_PATH;找到最短路徑,並在每個之間創建:RATIONAL_PATH; –