说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

利用Spring Data Neo4j搭建推荐系统

HTML文档下载 WORD文档下载 PDF文档下载
Neo4j是一款非常流行的开源图型NoSQL数据库。它完全支持ACID数据库事务属性,由于其良好的图数据模型设计,Neo4j的速度非常快。对于构建性能优异的推荐系统来说,Neo4j的速度要比传统的关系型数据库快1000倍。

本文作者Daniel Bartl是一位项目开发者,在这里分享如何使用Spring Data Neo4j来构建推荐系统。Neo4j是一款非常流行的开源图型NoSQL数据库。它完全支持ACID数据库事务属性,由于其良好的图形数据模型设计,Neo4j的速度非常快。对于连接的数据操作,Neo4j的速度要比传统的关系型数据库快1000倍。Spring Data是Spring的一个核心项目,其下涵盖了如Spring Data JPA、Spring Data MongoDB、Spring Data Redis、Spring 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中找到一些测试用例。

如何运行示例?

要想运行示例,你需要先安装好Maven。如果不熟悉Maven,那么可以阅读这篇文章来了解Maven的使用。示例代码位于github上,地址是https://github.com/comsysto/spring-data-neo4j-showcase。

遇到问题怎么办?

在准备这个示例时,我们遇到了一些挑战,相信你可能也会遇到:

  • 小心索引。如果使用id,那么应该在代码中将其声明为唯一的。
  • 如果使用的关系有属性,那么应该使用@RelatedToVia。
  • 初始化所有集合,比如说上述示例中使用的HashSet。
  • 不要将graphId作为ID。被删除结点的graphId会被Neo4j重用,并且在删除前一个后会用来表示另一个对象。
  • 对于关系的开始与结束结点使用@Fetch,否则在加载结点时是不会获取他们的。
  • 不要修改getters与setters,因为他们会被框架用来保存值。
  • 使用简单的语句来开始Cypher查询,然后不断扩展直到达到自己的目标。
  • 小心Cypher查询中的字符串 转义。Neo4j核心API中的字符串转义与Spring Data的不同。

另外,你可以根据自己的需要扩展示例。比如说,可以向结点实体添加更多的属性等。

原文:DZone                                                                                        (编译/薛梁  责编/付江)

TADOQuery下主明细表其属性关系如何设置,如何保存主表和明细表?-Delphi资料 TBatchMove用法-Delphi资料 TMemo的真正插入字符-Delphi资料 TREEVIEW的使用-Delphi资料 TreeView在电信综合统计管理系统中的应用-Delphi资料 VB6.0动态加载ActiveX控件漫谈-Delphi资料 捕捉来自 Thread 的异常-Delphi资料 定制Speedbar-Delphi资料 动态产生构件并相应事件-Delphi资料 对Borland可视部件的一处改进-Delphi资料 控件使用技巧-Delphi资料 改变VCL的行为--一个使用可视化元件的实例-Delphi资料 具有不同字体的列表框-Delphi资料 快速大量地更改控件内容-Delphi资料 快速动态创建MenuItem-Delphi资料 利用Delphi 5中调用Excel 97 利用Delphi的Tbitmap控件抓取屏幕图象 利用delphi美化你的菜单 面向组件的系统开发方法-Delphi资料 强大的树型编程控件TeeTree1.01-Delphi资料 确定MEMO控件中的当前行和列-Delphi资料 让字体左、右对齐-Delphi资料 如何给TListBox加上水平的滚动条?-Delphi资料 如何快速选择一个组件的父亲-Delphi资料 如何用Delphi编写自己的可视化控件 如何用VB创建控件-Delphi资料 生成程序组和项-Delphi资料 实现超级链接-Delphi资料 实战Delphi数据网格色彩特效 使dbgrid的某几笔资料变色-Delphi资料 树形图(Treeview)的使用概述-Delphi资料 一个庞大的计算计划,求解素数的间隔的 那句效率高点? 有没有sql server+asp开发的朋友,怎样把sql server数据库上传到服务器上,分绍有分! 如何注册使用控件,急!!! CView类中如何实现浮动的提示信息? 怎样给对话框创建一个视1? 报表计时用table,不用query,报表已设计好了,在显示预览时如果将一些不符合条件记录筛选择掉呢? 请问流是个什么概念? 我是初学,请指点 送分求购api用法及中文说明! asp页面可否设置关键字,使文章能被搜索引擎搜索到? ~~谁想做世界杯活力宝贝~~? 如何将StringGrid 中的数据保存为Html格式的表格 关于断点续传,请问大家 php中有没有 与 asp response.clear等同函数 单片机高手请看:中断中的中断,麻烦中的麻烦。 怎一个难字了得?挑战高手 如何改变LISTVIEW中各项的宽度 求《C++ Primer》中文版电子书下载;ejian@21cn.com 请问:在Asp中如何使用ODBC和SQL 注册表help... ListCtrl控件设为ICON属性,请问是否有subitem属性? Win2000系统去访问WIN98系统的服务器 PING的通 但打开的时候报参数出错! vb调用vc编的activex oem怎么老是连不上阿? 简单的入门问题:如何让菜单变灰? how add icon to one popup menu ? 怎么判断一个form对象变量为空呢? 发送和接收数据包问题? ActiveX问题,微软专家请进.<------------- 急 *.idc不能运行了,请问这是为什么? dbcontrols(泰山__抛砖引玉) 怎样才能够把ado记录集写到EXECL并进行打印呢? 如何判断字符串中,有几个指定的字符? xml数据文件倒入数据库,有什么好方法。 检查数据的有效性,最好是在哪一个事件中检查?怎样写,可否给点例子。 如何在DELPHI中调用FLASH图片。谢谢!有帮助的给分! 一个有关串列的question!HELP.. 怎样让对话框总在最前? 今天一个女孩脸红的对我说声谢谢 为什么dll调试跟踪不进去 菜鸟提问:请解释一下.vbs好吗?里面可以放那些东西,怎么引用.......等等 Delphi 2 BCB的问题:BCB中的"::", ".","->"有什么区别? *.idc不能运行了,请问这是为什么?谢谢 简单的数据库问题 CFileDialog()函数的参数问题????? php ed3.0 为什么不好使 大散分,快来答,答者有分! access 表中的datetime型字段在delphi中如何使用? 有谁看过《Visual C#.NET开发实践》?? 怎样改变按钮标题的颜色? 请大家帮忙测试一下这段winsocket代码,为什么接受不到字符串 数据库问题 当入射光线与平面镜成90度入射时,反射角改变多少度 如何让一棵树悄悄的死去 人教版一年级数学解决"一共有多少"的实际问题教学设计 英语翻译有谁有英文的数学类论文及它的中文翻译?请发给我,急用 600字左右,不要和其他的重复啊~ 写我初中第一次月考前的的作文的心情600字 英语翻译2.2.Estonian tourism statisticsTourism has an important role in the Estonian economy.According to the research conducted in co-operation withthe Statistical Office of Estonia and the Estonian Instituteof Economics of Tallinn Technical Uni 苏教版第二册一年级数学下册教案:26、求去掉多少的实际问题 甲型H1N1流感 为什么叫猪流感只是好奇而已! 当光线与平面镜成90度入射时,反射光线改变了( )度为什么 苏教版三年级数学下册全册教案哪里有 2010~2011 作文比赛2010年至2011年的作文比赛有哪些要有一定价值的比赛 最好是以投稿的形式不考虑哪些需要参加复赛的PS:新概念比赛我已经知道了就不要再说了速回~~~~~~~~~~~~~~~~~~~ 由于甲型h1n1流感的影响,在一个月内猪肉价格两次大幅下降,有原来的,每斤16元下调到每斤9元,求每次下调的百分率是多少?设平均每次下调的百分率为x,则方程可列为? 学校又买了7套桌椅,其中桌子共花了105.7元,椅子共花了77.7元.每张桌子比每把椅子贵多少元用两种方法解答 作文:告别2010年,迎接2011年好的++++++++++++分 学校操场是一个长110米 宽65米的长方形 在它的四周栽上绿化带 绿化带周长至少多少米 英语翻译关于幂等矩阵的值域与核摘 要本文通过幂等矩阵、投影矩阵和广义逆矩阵的有关知识,建立幂等矩阵的值域与核的关系式,再进行证明.证明时需要解决的问题是怎样去证明值域与核的 2010-2011年人教版八年级下学期期中语文有可能会考什么作文? 在长40米,宽30米的矩形操场四周设一个宽度相同的绿化地带,使所剩面积为原面积一半,则绿化带宽度为多少这是个填空题,我懒得算~ 英语翻译我在探究弹簧振子运动的过程中,发现泰勒级数可用于解一些简单的微分方程;用泰勒级数可以把解微分方程的问题转化为求数列通项公式的问题;我把这种方法应用于物理中,用于 2010-2011年度初三语文第一次月考试卷一、语言技能考查.(12分)下列题目均有若干个选项,选择其中符合题意的一项,将序号填在括号内,每题3分.1.请选出下列词语中加点字注音有误的一项( C 6年纪寒假作业P9第2题自己写一首一字诗 一个牧童坐在牛上面吹着笛子,二棵柳树还有一个太阳,太阳旁边有一只燕子,还有几朵云.参照:一帆一桨一鱼舟,一位渔翁一钓钩.一俯一扬一场笑,一江 受甲型H1N1流感影响,猪肉价格下降了30%,设原来的猪肉价格为a元/kg,则现在的猪肉价格为( )元/kg.回收废纸用于造纸可以节约木材,根据专家估计,每回收一吨纸可节约3平方米木材,那么回 英语翻译近几年来数学家们对于矩阵多项式的根的研究有了些研究成果,包括对形如AX XB=C的矩阵方程的研究,得出了在什么条件下矩阵方程AX XB=C有解,以及一般解的构造方法.在这篇文章中,我进 初中七年级寒假作业P9和P43的答案急求急求 一棵树木的命运请马上回答,这是me今晚的作业啊,急~~~~~~~~!谁先回答就采纳谁的!快~!快~!一棵生长了三十年的树命运却不由自主区区的几十元钱就断送了她守侯一生的孤独 那个拿着卷尺的家伙 急寻数学论文摘要翻译!摘要如下: 凹凸性是函数的一种独特性质,它有几何意义,也有代数意义,凹凸性与凸(凹)函数在不等式、泛函分析、最优理论、数学规划、运筹学、控制论及数理 su ban 怎样悄然无声的杀死一棵树 英语翻译利用仿射变换证明初等几何命题内容摘要:本文探讨了仿射变换在初等几何中的证明.提出了利用仿射变换证明初等几何命题的基本思路,并给出了它在三角形、四边形、圆锥曲线命 中国少年儿童新闻出版社总社(寒假作业)的P9页的第二题从方格的任意一个字开始一次走遍所有的格子,路线不能重复,正好成为首位相连的五个连环成语.人 老 下 月定 胜 底 捞马 天 海 人 一束光线垂直入射到平面镜上 入射角多少度反射光与入射光的夹角为多少 度 ° 坡角为30度的楼梯表面铺地毯,地毯长度至少需要多少米答案是2(1+根号3)告诉我怎么算三角函数我不懂 数理报 八年级下数学人教版答案拜托各位大神 二年级的第一次作文泡温泉怎么写? 坡度为1:2.5的楼梯表面铺地毯,地毯的长度至少需要多少m 银燕小学有一块长方形的花圃,在修建校园时,把花园的长增加了3米,于是面积增加了18平方米.现在这个花圃的面积是多少平方米? 1.要想使反射光线与入射光线之间夹角为90度,入射角应是多少度?2.一束光线垂直射到水平放置的平面镜...1.要想使反射光线与入射光线之间夹角为90度,入射角应是多少度?2.一束光线垂直射到水 学校购进了50套桌椅,每张桌子60元,每把椅子25元,一共用多少钱?(列综合算式,用2种方法解答) 银燕小学有一块长方形花圃,长8米.在修建校园时,于是面积增加了18平方米.现在这个花圃的面积是多少? 当光垂直射向平面镜时,入射角与反射角分别是多少度,当入射角是90度时,反射角是多少度也就是当入射角是90度时是不是就是相当于垂直射入 坡角为30度的楼梯表面铺地毯,地毯长度至少需要多少米答案是2(1+根号3)告诉我怎么算 梅山小学有一块长方形花圃,长8米.在修建校园时,花圃的长增加了3米,这样花圃的面积就增加了18平方米.原 一年级数学上册新人教版教案 第几和第几之间有几人 坡为30度的楼梯表面铺地毯,地毯的长度至少需要多少米(精确到0.1米) 怎样让一棵树死 初二上考册语文的作文有哪些! 怎样用最简便的方法杀死臭虫 什么方法让大树死的最快 初二下学期考什么作文我不要题目,我初一时考写人的,初二上学期考说明文,不晓得初二下学期考什么? 怎么消灭臭虫 四年下册 认识方程式 教案有哪位好人知道,我下个礼拜非常需要...如题`` 给3-5个最可能出的题目. 有什么好方法杀死臭虫 让一棵树悄悄的去死是这样的 领居家一棵梧桐树都长到我们家里来了 到秋天我家满院子都是树叶 刮大风的时候都依到墙上 很危险 和他说过一年年的也没砍.在他们那边长着友不能去根部放 食用猪肉能否感染甲型H1N1流感 怎样快速杀臭虫 怎么整死一棵树 当入射光线与平面镜成20°角时,反射角为( ) 大米里面有虫子怎么办啊,有没有什么简单的办法啊
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘