2013-02-11 120 views
2

最近幾天我一直在閱讀關於neo4j的內容。我對是否需要使用REST API或是否可以使用Java API感到困惑。REST API或Java API之間的選擇

  1. 我的需求是創建數百萬個節點,它們之間會有一些連接。我想在少數節點屬性上添加索引進行搜索。最初,我開始使用帶有Java API的GraphDB的嵌入模式,但很快就到達了OutOfMemory,並在幾個節點上建立索引,所以我認爲如果我的neo4j作爲服務運行並且通過REST API連接到它,那麼它會更好,然後它將完成所有內存管理本身通過交換數據到底層文件。我的假設是否正確?

  2. 此外,我有計劃將我的解決方案擴展到數十億個節點,我認爲單個機器的neo4j安裝是不可能的。我也相信Neo4j有分佈式運行的能力。出於這個原因,我還認爲繼續使用REST API實現是最好的想法。 儘管我找不到有關如何在分佈式環境中運行Neo4j的任何優秀文檔。

  3. 我可以使用REST API來執行批量插入等操作嗎?我使用Java API在嵌入式模式下運行Graph DB嗎?

回答

2
  1. 你知道你爲什麼讓你OutOfMemory例外?這聽起來像是你在同一個事務中創建了所有這些節點,這導致它存在內存中。嘗試一次提交小塊,以便Neo4j可以將其寫入到磁盤。除了緩存之外,您不必管理Neo4j的內存。

  2. 分佈式模式處於主/從架構,所以您仍然可以在每個系統上擁有整個數據庫的副本。 Neo4j對磁盤存儲非常有效,節點佔用9個字節,關係佔用33個字節,屬性可變。

  3. 有一個批處理REST API,它將多個調用分組到同一個HTTP調用中,但是如果嵌入它,使REST調用仍然比較慢。

使用您沒有提到的REST API有一些缺點,那就是事務。如果您要執行原子操作,您需要創建幾個節點,關係,更改屬性,並且如果任何步驟失敗都沒有提交它,則無法在REST API中執行此操作。

+0

從另一方面來說,您可以通過處理文檔的POST來告訴系統要做什麼(POST,因爲它不是冪等的),從而可以執行復雜的操作。但是,除非你在描述性元數據上做了很多額外的工作,否則這種機制的可發現性不是很好。 – 2013-02-11 20:50:40

+0

是的,我沒有抨擊'RESTful'網絡服務,而是'Neo4j'不允許跨多個'REST'調用進行交易。 – Nicholas 2013-02-11 20:51:51

+0

您確定在集羣中運行時,所有實例都包含相同的數據嗎?我想我讀了一個發行版,其中實例只是共享一部分數據,但不是全部。 – ulkas 2013-02-12 08:07:11