2014-09-22 50 views
4

我正在使用包含約1000萬個節點的Neo4J圖形的應用程序。我每天運行的主要任務之一就是將新/更新的節點批量導入圖形中,約爲1-2百萬個。在結合Cypher查詢語言對Python腳本進行試驗之後,我決定嘗試爲嵌入式圖形提供Java API,以獲得更好的性能結果。Java API與Python與Cypher for Neo4J的性能

我發現使用本機Java API的性能提高了5倍。我正在使用Neo4j 2.1.4,我相信這是最新的。我在其他文章中看到嵌入式圖形有點快,但是在不久的將來這應該會改變。我想與任何觀察到類似結果的人驗證我的發現?

我已經在下面包含片段,只是爲了給出一般的使用方法 - 代碼已大大簡化。從CYPHER /蟒蛇

示例:從嵌入式圖形

cnode = self.graph_db.create(node(hash = obj.hash, 
    name = obj.title, 
    date_created = str(datetime.datetime.now()), 
    date_updated = str(datetime.datetime.now()) 
)) 

樣品用java:

final Node n = Graph.graphDb.createNode(); 
for (final Label label : labels){ 
    n.addLabel(label); 
} 
for (Map.Entry<String, Object> entry : properties.entrySet()) { 
    n.setProperty(entry.getKey(), entry.getValue()); 
} 

感謝您的見解!

回答

4

你在這裏實際做的是比較兩個不同的API的速度,並僅僅使用兩種不同的語言來做到這一點。因此,你不會像喜歡那樣比較。 Java核心API和Python使用的REST API(以及其他語言)具有不同的習慣用法,例如顯式事務與隱式事務。此外,與REST API相關的網絡延遲將會產生很大的差異,特別是如果您爲創建的每個節點使用一個HTTP調用。

因此,爲了獲得更有意義的性能比較,請確保您比較喜歡:通過REST API使用Java或者使用Cypher進行兩種測試。提示1:通過將多個請求加入到單個API調用中,您將在REST上獲得更好的性能。

提示2:REST API永遠不會像核心API那樣快,因爲後者是本地的,前者有更多的層要經過。

0

沒有適當的性能測量,很難判斷時間在哪裏。一般來說,Python腳本比Java慢,但編寫代碼的語言更快,所以您交換開發速度以提高執行速度。

例如:上面的代碼需要一小時才能在Python中運行,而在Java中需要12分鐘。編寫Python版本花了你1天,Java版本花了你3天時間。這意味着您需要運行代碼至少2天/(60 - 12)分鐘= 60次才能達到收支平衡。

這個例子當然只有在等待48分鐘讓Python完成工作時纔有意義。如果您的系統在導入時已關閉,那麼60分鐘和12分鐘會產生巨大差異 - 除非您在夜間無人關心時運行它。