簡體   English   中英

基於圖形的數據庫和面向對象的數據庫有什么區別?

[英]What is the difference between graph-based databases and object-oriented databases?

基於圖形的數據庫( http://neo4j.org/ )和面向對象的數據庫( http://www.db4o.com/ )之間有什么區別?

我的回答方式不同:對象和圖形數據庫在兩個不同的抽象層次上運行。

對象數據庫的主要數據元素是對象,我們從面向對象的編程語言中了解它們的方式。

圖數據庫的主要數據元素是節點和邊。

對象數據庫沒有具有自動引用完整性等的兩個事物之間的(雙向)邊緣的概念。圖形數據庫沒有可以為NULL的指針的概念。 (當然可以想象混合動力車。)

在模式方面,對象數據庫的模式是應用程序中的一組類。 圖形數據庫的模式(無論是隱式的,通過String標簽的含義,還是顯式的,通過聲明作為模型,就像我們在InfoGrid所做的那樣)獨立於應用程序。 這使得使用圖形數據庫而不是對象數據庫針對相同數據編寫多個應用程序變得更加簡單,因為該模式與應用程序無關。 另一方面,使用圖形數據庫,您不能簡單地采用任意對象並持久化它。

我會想到不同工作的不同工具。

是的,API似乎是主要的區別,但並不是一個膚淺的。 從概念上講,一組對象將形成一個圖形,您可以想到一個以統一的方式處理該圖形的API。 相反,您可以在理論上挖掘模式的通用圖形結構,並將它們映射到通過某些API公開的對象。 但是實際產品的API設計通常會對數據的實際存儲方式,如何查詢數據產生影響,因此創建一個包裝器並使其看起來像是其他東西也是微不足道的。 此外,面向對象的數據庫必須提供一些完整性保證和圖形數據庫通常不會執行的類型結構。 事實上,嚴肅的OO數據庫遠非“自由形式”:)

看一下[HyperGraphDB] [1] - 它既是一個完整的面向對象數據庫(如db4o),也是一個非常高級的圖形數據庫,無論是代表性還是查詢功能。 它能夠存儲廣義超圖(其中邊可以指向多個節點,也可以指向其他邊),它具有嵌入為圖形等的完全可擴展類型系統。

與其他圖形數據庫不同,在HyperGraphDB中,每個對象都成為圖形中的節點或邊緣,具有非最小的API入侵,您可以選擇將對象表示為圖形或以與圖形正交的方式處理它們。圖結構(作為節點或邊的“有效負載”值)。 您可以執行復雜的遍歷,自定義索引和查詢。

為什么HyperGraphDB實際上是一個ODMS的解釋,請參閱博客文章是HyperGraphDB是一個OO數據庫嗎? 在Kobrix的網站上。

從另一個角度來看,graphdb會將您的數據與應用程序類和對象分開。 graphdb還具有更多內置功能來處理圖形,顯然 - 如最短路徑或深度遍歷。

另一個重要區別是,在像neo4j這樣的graphdb中,您可以根據關系(邊緣)類型和方向遍歷圖形,而無需加載完整節點(包括節點屬性/屬性)。 還可以選擇使用neo4j作為對象db的后端,仍然可以使用所有圖形內容,請參閱: jo4neo這個項目有一個不同的方法,也可以算作neo4j上的對象db: neo4j.rb 一個新選項是使用Spring Data Graph ,它通過注釋提供graphdb支持。

這篇博客文章的評論中提出了同樣的問題。

通過快速瀏覽他們的網站:

主要區別在於API的結構方式,而不是您可以使用它們構建的自由格式數據庫。

db4o使用對象映射 - 您創建Java / C#類,並使用反射將其持久保存在數據庫中。

neo4j有一個顯式的操作API。

在我的拙見中,Neo4j似乎更善於與之互動。

您可能還會考慮一個鍵值存儲 - 您可以使用其中一個來創建完全相同的自由格式數據庫。

低級別的差異並不是很大。 兩者都將關系作為直接鏈接進行管理,而無需進 此外,兩者都有一種遍歷與Query語言的關系的方法,但是圖形數據庫具有在第N級遞歸的運算符。

但最大的區別在於域:在圖形數據庫中,所有都基於2種類型:頂點和邊緣,即使通常您可以將自己的類型定義為Vertex或Edge的一種子類型。

在ODBMS中,您沒有Vertex和Edge概念,除非您自己編寫。

對於圖形數據庫,您有一種基於數學圖論的可能性。 使用面向對象的數據庫,您可以確定它基於什么都沒有(當然,根本沒有數學理論)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM