我正在構建一個應用程序,它需要不斷從本地MongoDB中提取大量數據,並將其放入Neo4j中。由於我也有許多用戶從Django網絡服務器和其他地方訪問Neo4j數據庫,因此我決定使用REST接口用於Neo4j。Neo4j - 將Java插件用於REST API以提高性能?
我遇到的問題是,即使使用批量插入,只要嘗試從mongoDB插入所有數據,Neo4j服務器的活動時間超過50%。據我所見,由於HTTP請求可能會有一些等待時間,但我一直在嘗試調整,但只得到了這麼多。
問題是,如果我編寫一個可以直接插入mongoDB提取的Java插件(http://docs.neo4j.org/chunked/stable/server-plugins.html),那麼我會繞過REST API嗎?或者,將java插件命令轉換爲常規的REST API請求?此外,使用該插件是否會提升性能?
最後一個問題是如何優化REST API的速度(到目前爲止,我正在執行大約1500次讀/寫操作,其中包括許多「get_or_create_in_index」操作)?是否有一個甜蜜點,附加到一個HTTP請求的查詢的數量將保持Neo4j繁忙,直到下一個HTTP請求到達?
更新:
我使用的Neo4j 2.0
,我提取包括藍牙意見,其中,運行應用程序的手機,我創建掃描附近所有手機的數據。然後,這個觀察結果將作爲文檔保存在MongoDB中,並由用戶ID,掃描時間以及他在掃描中看到的電話/用戶列表組成。
在Neo4j的我的所有用戶建模爲節點和我也兩個用戶之間觀測模型作爲節點,使得其看起來像這樣:
(用戶1) - [觀察] - >(observation_node) - [觀察] - >(用戶2)
此外我索引所有用戶節點。
當移動從MongoDB中到Neo4j的觀察,我做的每個文檔以下:
- 檢查中,如果用戶做掃描已分配的一個節點索引,否則創建一個
- 然後對於掃描中的每個觀察用戶:A)檢查索引,如果觀察到的用戶有一個節點,否則創建一個B)創建一個觀察節點以及用戶和觀察節點之間的關係,如果這還沒有存在的話。C)觀測節點和時間軸節點之間的關係(時間軸只由一個節點樹組成,以便我可以在特定時間快速找到觀測結果)
可以看出我在用戶索引(3),一些正常讀取(2-3)以及對每個觀察可能的很多寫入中進行了不少查找。
每個藍牙掃描的平均值大約爲5-30個觀察值,我在一個HTTP請求中批量掃描100次。這意味着每個請求通常包含5000-10000個更新。
感謝您的回答與文章!他們非常有見地。我已經更新了這個問題。你認爲從Mongo到Neo4j的這種轉移是否會對使用擴展而不僅僅是調用REST API的python腳本有利? – ReturnToZero