2016-05-13 44 views
1

我正在構建一個非常適合圖形數據庫的應用程序,並決定使用Neo4J。我有兩個想法:是否在Neo4J節點上存儲關於特定節點的數據,或者只是引用mongo db中的項目。Neo4J由MongoDB或Neo4J支持

例如

(聯繫人:NAME = 「條例」,年齡= 29,ID = 1)< -neo

(聯繫人:ID = 1,UUID = 「一些的UUID」)< - 新 {UUID: 「一些的UUID」 NAME = 「條例」,年齡= 29} < - 蒙戈

我計劃有一個REST接口,這可能看起來像數據:

/user/{id}

  • (neo)我會通過neo中的id查找個人用戶。
  • (neo + mongo)我會在mongo中找到用戶(不需要觸摸neo)。

    /user/{id}/friends

  • (新)查找用戶的所有朋友和加載節點

  • (新+蒙戈)查找用戶的所有朋友們的ID和然後查詢蒙戈的數據

所以我想我的問題是:是否有一個存儲我的數據有關節點的所有Neo(性能等),因爲這看起來更乾淨和簡單。

感謝,

+0

您還存儲了哪些其他數據? – manonthemat

+0

無論您使用單個數據庫還是採用* polyglot持久性*方法並使用多個數據庫,都無法正確回答此問題。這將取決於數據的特定形式,以及如何利用每個數據庫的優勢。在你的例子中,儘管你同時使用了兩個,但你只能在neo4j中存儲一個id,所以在那種情況下,你甚至如何利用Neo4j的查詢功能? –

回答

2

這取決於你的數據的大小(結構),什麼類型的查詢,你會運行。有可能觀察到的性能損失,如果你存儲在節點上的數據量巨大 - 但「龐大」難以確切數字來定義;)是一些指導方針/事情要考慮:

  • 你能想象有運行使用更多屬性進行過濾的查詢 - 您想在查詢中使用的任何內容必須位於圖中。你的屬性是少數還是多數?就個人而言,如果我有過濾器的20%屬性的分配,並且只有當您找到節點時才使用80%的屬性,那麼我會考慮雙存儲(如果存在其他因素)。如果它是相反的(80%用於查詢,20%不用) - 可能爲了簡單起見,我會將所有內容存儲在一張圖中。
  • 由於實施本地存儲的方式,Neo應該比大量小型屬性更少數量的大型屬性更好地工作。我已經做了一些粗略的測量,將單個json的所有道具分別存儲到每個屬性中,並且導入大量CSV的速度要快幾倍,但沒有測量讀數,但我預計它也會受到影響。所以,如果你只有幾個屬性,你會變得更好,如果你有他們的負載,並且你想保持它們分開
  • 你是否圖形大小和速度的要求實際上證明擔心它。 mongo(或其他)中未使用的屬性可能會更快,如果差異是 - 例如 - 典型查詢中的100ms與200ms之間的差異,則可能不值得增加項目的複雜性。

總的來說,你的問題肯定是有效的,有些項目我聽說有人將一些數據從圖中移出。然而,我不會從這一開始 - 我將所有內容都放入neo4j中,首先對查詢和用例進行基本的性能測試,然後將結果重構爲mongo,但前提是性能或存儲大小是不可接受的。

P.S.我還應該提到,如果假設你對讀取操作很聰明,你可能會在寫入時看到這一點。如果您設法讓閱讀查詢以只返回特定屬性(而不是完整節點)的形式出現,那麼無論多少屬性「附加」,閱讀都不會受到影響。換句話說,如果用戶擁有大量屬性並且只對名稱感興趣,那麼執行RETURN user.name將比RETURN用戶快得多。

0

記得我幾年前在倫敦的圖形連接有趣的演示文稿。阿迪達斯全球實際上使用neo4j作爲元數據存儲。我覺得莉莉已經給出了很好的答案。也許我可以補充一件事。

我確實認爲neo的傢伙做得非常出色,而且您應該獲得企業版的許可證。但是:如果你不在那裏,你將不得不使用社區版。這意味着你將沒有高可用性羣集。當然,您可以設置多個實例並將它們放在負載平衡器後面。但是,如果您將neo用作主數據存儲區,則意味着您必須進行寫入操作。這種情況會非常快速地變得非常糟糕。

如果您需要使用社區版本(暫時),並且希望能夠進行擴展,那麼您只會停留在只讀數據庫和批處理過程中。 (請注意,批量導入器速度非常快,但確實需要Java)。

如果您可以使用企業比您可以做(近)實時更新。你可以使用neo4j作爲主數據存儲。

但我不會這樣做。這是我的個人建議。使用neo4j來處理它的好處。不要將其用作主數據存儲。 Neo4j未針對數據存儲進行優化。無論您是使用MySQL,MongoDB還是Hadoop。他們每個人都參與neo4j沒有(也可能不應該)關心自己的功能。 neo4j也很依賴RAM。我希望neo儘可能高效地使用可用內存。

最後但並非最不重要。 Neo4j非常好地解決了預定義的問題。這意味着您的數據通常是在域問題之後建模的,您需要快速,實時地回答問題。但所需的模型可能根本不代表您的數據結構。你可能想要考慮的東西。 :-)