有沒有既具有傳統關系型資料庫的優點,又具備nosql資料庫優勢的一種資料庫呢?neo4j就是一種這樣的資料庫。neo4j是一個高性能的nosql圖資料庫,并且具備完全事務特性。neo4j将結構化資料存儲在一張圖上,圖中每一個節點的屬性表示資料的内容,每一條有向邊表示資料的關系。neo4j沒有表結構的概念,它的資料用節點的屬性來表示。
在spring boot中使用neo4j非常容易,因為有spring-data-neo4j提供了強大的支援。首先,在工程的maven管理中引入neo4j的相關依賴,如代碼清單2-20所示。
代碼清單2-20 使用neo4j的maven依賴配置
雖然neo4j沒有表結構的概念,但它有節點和關系的概念。例如,現在有演員和電影兩個實體,它們的關系表現為一個演員在一部電影中扮演一個角色。那麼就可以建立演員和電影兩個節點實體,和一個角色關系實體。它們的實體-關系模型如圖2-5所示。
3

這個實體-關系模型的定義比起關系型資料庫的實體-關系模型的定義要簡單得多,但是它更加形象和貼切地表現了實體之間的關系。更難能可貴的是,這個實體-關系模型是可以不經過任何轉換而直接存入資料庫的,也就是說,在neo4j圖資料庫中儲存的資料與圖2-5所示的相同,它仍然是一張圖。這對于業務人員和資料庫設計人員來說,它的意義相同。是以使用neo4j資料庫,将在很大程度上減輕了設計工作和溝通成本。
像jpa使用了orm一樣,neo4j使用了對象-圖形映射(object-graph mapping,ogm)的方式來模組化。代碼清單2-21是演員節點實體模組化,使用注解@jsonidentityinfo是防止查詢資料時引發遞歸通路效應,注解@nodeentity标志這個類是一個節點實體,注解@graphid定義了節點的一個唯一性辨別,它将在建立節點時由系統自動生成,是以它是不可缺少的。這個節點預定義了其他兩個屬性,name和born。節點的屬性可以随需要增加或減少,這并不影響節點的使用。
代碼清單2-21 演員節點實體模組化
代碼清單2-22是電影節點實體模組化,注解@relationship表示list是一個關系清單,其中type設定了關系的類型,direction設定這個關系的方向,relationship.incoming表示以這個節點為終點。addrole定義了增加一個關系的方法。
代碼清單2-22 電影節點實體模組化
代碼清單2-23是角色的關系實體模組化,注解@relationshipentity表明這個類是一個關系實體,并用type指定了關系的類型,其中@startnode指定起始節點的實體,
@endnode指定終止節點的實體,這說明了圖中一條有向邊的起點和終點的定義。其中定義了一個建立關系的構造函數role(actor actor,movie movie,string name),這裡的name參數用來指定這個關系的屬性。
代碼清單2-23 角色關系實體模組化
像對其他資料庫的通路和存取等操作一樣,spring-data-neo4j提供了功能豐富的資源庫可供調用,是以,對于演員和電影節點實體,可以建立它們對應的資源庫接口,實作實體的持久化。代碼清單2-24是電影資源庫接口的定義,它繼承于graphrepository接口,實作了電影實體的持久化。使用相同方法可以對演員的節點實體實作持久化。關系實體卻不用實作持久化,當儲存節點實體時,節點實體的關系将會同時儲存。
代碼清單2-24 電影實體持久化
@repository
public interface movierepository extends graphrepository {
}
其中graphrepository接口的繼承關系也遵循了spring boot資源庫定義的規則,即使用與jpa相同的标準規範,是以它同樣包含使用資料庫的豐富功能,如圖2-6所示。
代碼清單2-24是neo4j的資料庫配置類,其中@enable-transactionmanagement啟用了事務管理,@enableneo4jre-positories啟用了neo4j資源庫并指定了我們定義的資源庫接口的位置,在重載的sessionfactory函數中設定了定義實體的位置,這将促使定義的實體被作為域對象導入,remoteserver設定連接配接neo4j伺服器的url、使用者名和密碼,這些參數要依據安裝neo4j伺服器的情況來設定。如果還沒有安裝neo4j伺服器,可參考附錄a的方法進行安裝,安裝完成後啟動伺服器以備使用。
代碼清單2-25 neo4j配置類
現在可以編寫一個測試程式來驗證和示範上面編寫的代碼的功能,如代碼清
單2-26所示。這個測試程式分别建立了三部電影和三個演員,以及三個演員在三部電影中各自扮演的角色,然後按照電影标題查出一部電影,按照其内在的關系輸出這部電影的資訊和每個演員扮演的角色。這些資料的内容參照了neo4j幫助文檔中提供的示例資料。
代碼清單2-26 使用neo4j的juint測試程式
在idea的run/debug conf?iguration配置中增加一個juint的配置項目,子產品選擇neo4j,工作目錄選擇子產品所在的根目錄,測試程式選擇movietest這個類,并将配置儲存為neo4jtest。
使用debug模式運作測試項目neo4jtest,如果測試通過,将在控制台中看到輸出查詢的這部電影和所有演員及其扮演的角色,如下所示:
=== movie=== movie:the matrix, 1999-03-31
====== actor:keanu reeves, role:neo
====== actor:laurence fishburne, role:morpheus
====== actor:carrie-anne moss, role:trinity
這時,在資料庫用戶端的控制台上,單擊左面側邊欄的關系類型acts_in,可以看到一個很酷的圖形,圖中每部電影和每個演員是一個節點,節點的每條有向邊代表了這個演員在那部電影中扮演的角色,如圖2-7所示。