1. 程式人生 > >利用Spring Data Neo4j搭建推薦系統

利用Spring Data Neo4j搭建推薦系統

本文作者Daniel Bartl是一位專案開發者,在這裡分享如何使用Spring Data Neo4j來構建推薦系統。Neo4j是一款非常流行的開源圖型NoSQL資料庫。它完全支援ACID資料庫事務屬性,由於其良好的圖形資料模型設計,Neo4j的速度非常快。對於連線的資料操作,Neo4j的速度要比傳統的關係型資料庫快1000倍。Spring DataSpring的一個核心專案,其下涵蓋了如Spring Data JPASpring Data MongoDBSpring Data RedisSpring for Hadoop等子專案,而Spring Data Neo4j也是Spring Data下的一個重要子專案,它提供了高階的特性以將註解的實體類對映到Neo4j圖型資料庫上。其模板程式設計模型類似於我們熟知的Spring模板,為與圖的互動提供了基礎,此外也用於高階的倉庫支援。該專案旨在為NoSQL資料庫操作提供便捷的支援。

在文章的末尾實現了一個的示例,該示例是一個購物系統,能計算出其他使用者的瀏覽結果供當前使用者參考是很重要的特性,現在很多電商都提供了這個特性,例如Amazon。由於使用者與商品之間的聯絡是很容易使用圖表來表達的,因此該示例將使用Neo4j來表示結點以及結點之間的關係。


Spring Data Neo4j簡介

首先來介紹一下Spring Data。這是SpringSource的一個專案,旨在為NoSQL資料庫提供Spring的程式設計模型以及便捷性。Spring Data支援各種NoSQL資料庫,如Redis、Riak以及MongoDB等等。它還為Hadoop等MapReduce實現提供了一個抽象層。

Spring Data Neo4j起步於2010年,你可以在Neo4j網站上找到很多有價值的資源。目前最棒的指南就是由該專案的主開發者Michael Hunger所編寫的“Good Relationships”,這本指南提供了免費的下載,也有相應的HTML版本。其中有些Spring Data Neo4j程式碼示例位於Spring Data Neo4j Git倉庫上。此外,O’Reilly也有一本關於Spring Data Neo4j的圖書

為何不使用核心Neo4j?

當然了,你也可以只使用核心Neo4j或是構建自己的整合方案。但如果你過去曾有過其他的Spring專案開發經驗,那麼你就會發現Spring的好處了。作為一名軟體工程師,你不想關注於實體對映或是事務管理等細節資訊。你只要瞭解這些概念就行了,剩下的事情Spring會幫你處理,這相當於Spring中的Hibernate支援一樣:

  • 通用的Spring與Spring Data基礎設施。你可以輕鬆將Neo4j嵌入到Spring框架所管理的現有應用當中。
  • 通過註解來宣告結點以及結點之間的關係。
  • 程式碼很容易理解。
  • 實體狀態由圖型資料庫所維護。
  • 支援Neo4j伺服器。

如何使用Spring Data Neo4j?

如果使用Maven,那麼你可以通過將如下配置新增到pom.xml中,將Spring Data Neo4j引入到專案中(除了Spring與Neo4j的依賴外):

  • 通用的Spring與Spring Data基礎設施。你可以輕鬆將Neo4j嵌入到Spring框架所管理的現有應用當中。
  • 通過註解來宣告結點以及結點之間的關係。
  • 程式碼很容易理解。
  • 實體狀態由圖型資料庫所維護。
  • 支援Neo4j伺服器。

通過如下Spring的上下文來設定Neo4j:


Neo4j配置的“storeDirectory”屬性可以是任意的目錄,Neo4j資料庫將會儲存在那裡。接下來開始實現代表圖模型的結點與關係實體。

如何宣告結點實體?

建立如下的類來表示結點實體:


在Spring框架中getters與setters對於屬性訪問是必須的。你還可以實現自己的額外的方法。一個典型的Neo4j實體一般是個經典的JavaBean,包含了屬性以及訪問器。此外,我們還建議實現equals與hashCode方法,因為有時Spring Data Neo4j會比較物件來判斷結點與關係對映。

如何建立結點與實體間的關係?

Spring Data可以通過3種不同的方式來處理結點間的關係,到底選擇哪一種取決於兩個方面:需要建模的關係型別(1對1還是1對多)以及是簡單關係還是複雜關係。複雜關係擁有額外的屬性。

1對1關係非常簡單:主結點通過屬性來引用子節點(需要實現訪問器),無需註解。Spring Data會處理所有其他事情。

在簡單的1對多關係中,你需要在主結點中新增一個包含子結點的集合(參見上述程式碼示例)。除此之外,你還需要通過@RelatedTo(type = “relationshipType”) 對集合添加註解,如下所示:

複雜關係能夠展示出Spring Data強大的圖建模能力。你可以通過額外的屬性對真實世界的關係建模,為了做到這一點,你需要建立用於儲存關係屬性的關係實體。此外,還需要通過註解(@StartNode與@EndNode)來指定主結點和子結點。參加如下程式碼示例:

要注意@Fetch屬性。在很多情況下,在載入完特定的實體後,並不是所有相關的1對多物件都需要加載出來。當載入了一個結點實體後,Spring Data的預設行為只是取得標識相關物件的ID列表。這種方式類似於Hibernate等框架的延遲載入機制。如果不希望這樣,那可以在相應的結點實體上新增@Fetch註解。

一般來說,將關係型別作為常量定義在單獨的類中是個好做法,因為這些字串會用在不同類中的不同結點上。我們的圖模型在結點間存在兩種關係型別,因此這個類如下程式碼所示:


如何載入實體及實體間的關係?

要想訪問實體與關係,我們需要建立自己的介面並繼承Spring的GraphRepository介面,如下程式碼所示:

如你所見,這個圖倉庫是個介面,只定義了函式名、返回值與Cypher查詢(如果需要的話)。這非常方便,因為框架並不需要相應的實現。根據上面宣告的引數以及主介面“GraphRepository”,Spring Data可以創建出與Neo4j核心API互動的代理物件。要想了解更多細節資訊,請參閱關於倉庫的文件。如果不熟悉Cypher,那麼請看看這個Cypher指南。然而,有時自己實現GraphRepository也是必要的,在這種情況下,你可以編寫一個類並繼承該介面。

Spring Data Neo4j有哪些限制?

  1. 現在,它無法運行同時包含DISTINCT與ORDER BY的Cypher查詢。
  2. 如果遇到問題,日誌訊息不太直觀。

關於示例

該示例展示了一個購物系統的圖倉庫部分,重點是獲得其他使用者也檢視過的商品。比如說,如果瀏覽過“乳酪比薩”頁面的使用者也看過“培根披薩”頁面,那麼這對於尋找“乳酪比薩”的使用者也會很有用。你可以在Spring Data Neo4j Product User Test class中找到一些測試用例。

如何執行示例?

遇到問題怎麼辦?

在準備這個示例時,我們遇到了一些挑戰,相信你可能也會遇到:

  • 小心索引。如果使用id,那麼應該在程式碼中將其宣告為唯一的。
  • 如果使用的關係有屬性,那麼應該使用@RelatedToVia。
  • 初始化所有集合,比如說上述示例中使用的HashSet。
  • 不要將graphId作為ID。被刪除結點的graphId會被Neo4j重用,並且在刪除前一個後會用來表示另一個物件。
  • 對於關係的開始與結束結點使用@Fetch,否則在載入結點時是不會獲取他們的。
  • 不要修改getters與setters,因為他們會被框架用來儲存值。
  • 使用簡單的語句來開始Cypher查詢,然後不斷擴充套件直到達到自己的目標。
  • 小心Cypher查詢中的字串 轉義。Neo4j核心API中的字串轉義與Spring Data的不同。

另外,你可以根據自己的需要擴充套件示例。比如說,可以向結點實體新增更多的屬性等。

原文:DZone                                               

相關推薦

利用Spring Data Neo4j搭建推薦系統

本文作者Daniel Bartl是一位專案開發者,在這裡分享如何使用Spring Data Neo4j來構建推薦系統。Neo4j是一款非常流行的開源圖型NoSQL資料庫。它完全支援ACID資料庫事務屬性,由於其良好的圖形資料模型設計,Neo4j的速度非常快。對於連線的資料操作,Neo4j的速度要比傳統的關

訪問Neo4j spring-data-neo4j入門 (二)@Query 複雜查詢

本文在訪問Neo4j spring-data-neo4j入門 (一) 基礎上成文,因此請先閱讀訪問Neo4j spring-data-neo4j入門 (一) 。 我們在上一篇提到使用@Query完成複雜查詢,如同我們的業務一樣,使用簡單的比較大小、日期範圍無法完成業務需要,特別是當我

Spring系列學習之Spring Data Neo4J資料訪問

英文原文:https://spring.io/projects/spring-data-neo4j 目錄 概述 特性 學習 文件 概述 該專案為Neo4j圖形資料庫提供Spring Data支援,包括帶註釋的POJO,SD-Repositories和Neo4j-Tem

SpringBoot第二講利用Spring Data JPA實現資料庫的訪問(二)_分頁和JpaSpecificationExecutor介面介紹

我們繼續研究spring jpa data,首先看看分頁和排序的實現,在原來的程式碼中,我們如果希望實現分頁,首先得建立一個Pager的物件,在這個物件中記錄total(總數),totalPager(總頁數),pageSize(每頁多少條記錄),pageInde

shiro+cas+spring-data-redis實現多系統單點登入和分散式專案的session同步

CSDN開通很久了,但是一直沒寫東西,2018年了,這是我CSDN的第一篇文章,歡迎各位評論探討和指點。   一、背景: 現在公司的業務系統要做多臺分散式叢集,由於是web專案,要做session同步,想到的方案是用目前火熱的redis資料庫儲存session,還有業

spring data neo4j 查詢超時問題

使用sdn查詢時,當資料量較大並且需要做全庫掃描時,很容易出現超時問題。丟擲如下異常: Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: java.ne

Spring Data Neo4j reference文件中關於@RelatedTo註解的注意事項

源於3.2.2的reference文件 22.5.5.基於結束節點(end node)區分關係 22.5.5. Discriminating Relationships Based On End Node Type ... Example 61. Discrimin

Spring Data jpa搭建+配置詳解

     我們都知道Spring是一個非常優秀的JavaEE整合框架,它儘可能的減少我們開發的工作量和難度。   在持久層的業務邏輯方面,Spring開源組織又給我們帶來了同樣優秀的Spring Data JPA。   通常我們寫持久層,都是先寫一個介面,再寫介面對應

通過Spring Data Neo4J操作您的圖形資料庫

在前面的一篇文章《圖形資料庫Neo4J簡介》中,我們已經對其內部所使用的各種機制進行了簡單地介紹。而在我們嘗試對Neo4J進行大版本升級時,我發現網路上並沒有任何成型的樣例程式碼以及簡介,而其自身的文件也對如何使用Spring Data Neo4J介紹得語焉不詳。因此在本文

《Hadoop進階》利用Hadoop構建豆瓣圖書推薦系統

轉載請註明出處: 轉載自  Thinkgamer的CSDN部落格:blog.csdn.net/gamer_gyt 程式碼下載地址:點選檢視 1:推薦系統概述 2:需求分析:推薦系統的指標設計 3:演算法模型:基於物品的協同過濾並行演算法設計 4:架構設計:推

Spring Data Neo4j個人筆記

由於機緣巧合,原來要接手做一個和圖資料庫相關的外包專案。但是由於臨近畢業,各種壓力大,遂放棄。但是自己還是各種翻牆瞭解了一番Neo4j,我自己理解的Neo4j就是一個圖資料庫,它存在的目的就是類似一個引擎,使得一些巢狀級別高的,可以以更快的速度來獲取結果。僅僅是個人見解,不知道對不對。發現度娘很難找到自己需

SpringBoot第二講 利用Spring Data JPA實現資料庫的訪問(一)

在基本瞭解了springboot的執行流程之後,我們需要逐個來突破springboot的幾個關鍵性問題,我們首先解決的是springboot訪問資料庫的問題。Java訪問資料庫經歷了幾個階段,第一個階段是直接通過JDBC訪問,這種方式工作量極大,而且會做大量的重複勞動,之

SpringData系列一Spring Data的環境搭建

vendor ssi over str spa ger repos getbean date  本節作為主要講解Spring Data的環境搭建 JPA Spring Data :致力於減少數據訪問層(DAO)的開發量。開發者唯一要做的就是聲音持久層的接口,其他都交給

Spring Data 開發環境搭建(二)

是不是 lns utf-8 void ext for 實體類 connect domain 首先咱們先創建一個maven工程 在pom.xml加入以下 依賴 <!--Mysql 驅動包--> <dependency> <

Ubuntu系統利用Vultr服務器搭建SS教程

Vultr搭建SS Vultr SS Ubuntu搭建SS VPS搭建SS 搭建SS教程 我這邊是用ubuntu在海外服務器上(Vultr)部署的SS,下面來教大家怎麽搭(文末附帶工具下載地址): 一、購買服務器 要搭梯子,首先得有一個香港或者海外的服務器,這裏我用的是Vultr,經過對比

Spring-data-Jpa項目搭建

tex show pla adapter format manage strategy print table 傳送門:Spring Data 學習 Spring Data 開發環境搭建 簡介 Spring Data是什麽   Spring Data是一個用於簡化數

推薦系統實踐(項亮)— 第5章 利用上下文資訊

  準確瞭解使用者的上下文資訊(包括時間、地點、心情等),對於提升推薦效果有重要作用。 5.1 時間上下文資訊 (1)時間效應 使用者的興趣是變化的 物品也有生命週期 季節效應 (2)系統時間特性的分析 資料集每天獨立使用者數的增長情況 系統物品的變化情況

基於Springboot技術的部落格系統實踐及應用之三(Spring Data JPA)

本部落格將從JPA簡介、Spring Data JPA用法介紹、Spring Data JPA、Hibernate與SpringBoot整合以及資料持久化實戰四個方面進行詳細描述Spring Data JPA的用法和應用。 1、JA

領英利用深度表徵學習提升人才搜尋和推薦系統

本文介紹了領英利用深度表徵學習模型來提升人才搜尋和推薦系統。 領英徵才解決方案(LinkedIn Talent Solutions,LTS)業務為領英貢獻了大約 65% 的年收入,該業務方便職位提供者接觸潛在應聘者,也方便求職者找到合適的工作機會。領英求職生態系統的設計方向是使其成為連線職位提供者

Neo4j推薦 (8)—— 協同過濾(利用電影評級)

協同過濾: 使用網路中其他使用者的首選項,評級和操作來查詢要推薦的專案。 (買這個東西的使用者,還買了那個東西)   使用者Misty Williams的所有評分 // Show all ratings by Misty Williams MATCH (u:User