我需要能夠快速找到n個給定目的地的最近目的地,計算n個目的地的n×n距離矩陣,以及與兩個或更多目的地之間的距離相關的其他幾個此類操作。使用圖表DB來存儲位置之間的距離用PHP
我學會了一個Graph DB與MySQL數據庫相比將會有更好的性能。我的應用程序是用PHP編寫的。
所以我的問題是 - 是否有可能使用圖形數據庫與PHP應用程序,如果是,那麼哪一個是最好的選擇和開源,以及如何將這些數據存儲在圖形數據庫中,它將如何被訪問。
在此先感謝。
我需要能夠快速找到n個給定目的地的最近目的地,計算n個目的地的n×n距離矩陣,以及與兩個或更多目的地之間的距離相關的其他幾個此類操作。使用圖表DB來存儲位置之間的距離用PHP
我學會了一個Graph DB與MySQL數據庫相比將會有更好的性能。我的應用程序是用PHP編寫的。
所以我的問題是 - 是否有可能使用圖形數據庫與PHP應用程序,如果是,那麼哪一個是最好的選擇和開源,以及如何將這些數據存儲在圖形數據庫中,它將如何被訪問。
在此先感謝。
Neo4j是一個非常可靠的圖形數據庫,並且具有靈活(如果有點複雜)許可。它實現了Blueprints API,並且應該很容易使用任何語言,包括PHP。它也有一個REST API以及它的靈活性,至少有one good example使用它從PHP。
根據你有什麼數據,有很多種方法來存儲它。
如果你有「路由」數據,你的點已經通過特定路徑相互連接(即你不能從一個點直接跳到另一個點),那麼你只需使每個點成爲一個節點,您的路線中的點之間的連接是節點之間的邊界,距離作爲這些邊的屬性。這會給你一個看起來像你的經典「旅行推銷員」問題的圖表,並且計算節點之間的距離只是做一個加權的廣度優先搜索(假設你想要最短路徑)。
如果你可以跳轉到你的數據集,然後你有一個fully connected圖。顯然,這是很多數據,並且隨着您添加更多目標而以二次方增長,但圖形數據庫在處理此問題方面可能比關係數據庫更好。要存儲距離,當您將節點添加到圖形中時,還需要爲每個其他節點添加一條邊,並將距離預先計算爲它的一個屬性。然後,爲了檢索一對節點之間的距離,你只需找到它們之間的邊,並獲得它的距離屬性。然而,如果你有一個完全連接的節點數量,你可能會更好的只是存儲這些節點的座標並根據需要計算距離,並且可以選擇緩存結果以加快速度。
最後,如果你使用的藍圖API,並在堆棧中的其他工具,如Gremlin和Rexter,你應該能夠在輸入/輸出任何兼容的圖形數據庫,它可以讓你用不同的實現玩掉那可以更好地滿足您的需求,例如在Cassandra/Hadoop羣集的頂部使用Titan。
是的,圖形數據庫將爲您提供比MySQL或Postgres能夠擴展更多的性能。一個looks really slick是OrientDB,有一個beta implementation in PHP using the binary protocol和another one that uses HTTP作爲傳輸層。
至於示例代碼,Alessandro(來自odino.org)寫了implementation的Dijkstra's algorithm以及full explanation of how to use it with OrientDB to find the minimum distance between cities。
實際上它並沒有像索引那麼多關於數據庫。我使用了MongoDB的geospatial indexing和搜索(文檔數據庫),它具有地理索引,用於查找給定座標的多個最近元素 - 並獲得良好結果。仍然 - 它只運行簡單的查詢(查找最近),如果你的索引不適合內存,它會變得有點慢(我已經使用座標爲8mln的geonames DB,並且在VM上每次查詢得到0.005-2.5s - 1.HDD開銷2.可能索引不適合RAM)。
考慮PostGIS –
將不得不從MySQL爲此。 –
我的意思是我將不得不將應用程序移植到當前正在使用MySQL的PostgreSQL。 –