2014-10-02 104 views
2

我不知道Neo4j如此,請耐心等待。我有一個大的(1M節點)無向圖,未加權的圖。假設我神奇地將這個圖導入Neo4j。 Neo4j查詢引擎(cypher)可以支持以下類型的查詢嗎?Neo4j最短路徑(BFS)距離查詢變體

  • 範圍查詢。使距離特定節點3跳距內的所有節點(以及它們的距離)
  • 在特定節點和一組特定節點之間引入最短路徑(BFS)距離(因爲該圖無向加權 )節點。
  • 帶來特定節點和所有其他圖形節點之間的最短路徑(BFS)距離。

如果這些類型的查詢實際上是可能的,沒有遞歸類型的實現,但直接從Cypher,我應該期望什麼類型的性能(幾秒鐘,幾秒鐘或幾分鐘)?

回答

6

是的,密碼可以做所有這些事情。

範圍查詢是這個樣子:

MATCH path=(a:MyNode { name: "Foo"})-[:myRelationshipType*1..20]->(b)); 

這就給了你所有的「B」的節點是1個20之間跳從與給定的關係類型MYNODE。匹配的路徑是一個變量,可以應用各種密碼功能。因此,對於每條路徑,您可以問它是多久,中間是什麼,等等。 cypher refcard顯示適用於路徑的函數,以瞭解您可以對它們執行的操作。

最短路徑搜索can be found here並在密碼中使用shortestPathallShortestPaths函數。

如果你想從某件事物到圖中所有其他事物的最短路徑,你可以在一個查詢中做到這一點;最短路徑將從匹配「頭」節點和「尾」節點開始。在找到從一件事到其他事物的最短路徑的情況下,頭節點匹配將成爲您感興趣的節點,並且尾節點匹配將是「圖中的任何節點」。例如。 MATCH (a:MyNodeOfInterest), (b), p=shortestPath((a)-[*]->(b))。所以你可以在一個查詢中做到這一點,,但,如果你想在一百萬個節點圖中找到最短路徑從一件事到一切,這將需要一些時間,無論你使用什麼圖形數據庫使用。

在性能方面,沒有人能真正準確地回答這個問題。這將取決於很多不同的因素,如:

  1. 總數據量
  2. 索引策略
  3. 您使用/濫用節點的標籤,和關係類型
  4. 路徑總長度
  5. JVM /內存/緩存配置。
+0

謝謝你的回答。已經upvoted。但是a)範圍查詢實際上包括哪個節點處於該範圍內的最小距離的信息。如:a)節點c = 2hops,節點b = 3hops。關於最短路徑。我知道Neo4j給出了2個節點之間的最短路徑。但是當我想計算節點和所有其他圖形節點之間的距離時,這是否意味着我必須執行總共1M個查詢? – Alexandros 2014-10-02 14:32:52

+0

更新回答解決您的其他問題。一探究竟。 – FrobberOfBits 2014-10-02 14:38:17

+0

非常好。非常感謝你。這就是我需要知道的 – Alexandros 2014-10-02 14:39:45