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

利用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                                                                                        (编译/薛梁  责编/付江)

如何在程序中动态取得Win95/98的网络邻居中的工作组及计算机名?-Delphi资料 提高客户机/服务器应用系统性能的一些方法-Delphi资料 网络和通讯编程-Delphi资料 WebBrowser流程讲解及如何判断下载网页成功-Delphi资料 用Delphi 3.0实现运行于浏览器内的客户 用Delphi编写ASP的ActiveX 用Delphi编写CGI程序(五) 用Delphi编写CGI程序返回图象 用Delphi程序获取拨号连接的动态IP地址 用Delphi创建Internet快捷方式 用Delphi实现NetBIOS广播收发 用Delphi实现网络驱动器的映射和断开 用Delphi实现远程屏幕抓取 用DELPHI制作留言板 再谈用Delphi程序获取拨号连接的动态IP地址 在DELPHI程序中拨号上网 在DELPHI程序中获取网络资源信息 在Delphi程序中应用IE浏览器控件 在Delphi中调用NetscapeNavigator 在Delphi中使用flash控件 在Delphi中使用IP控件 在程序中动态取得Win95/98网络邻居中工作组及计算机名-Delphi资料 在程序中获取网络资源信息-Delphi资料 自制THyperLink组件-Delphi资料 报表制作技巧(三)-Delphi资料 Delphi数据库开发及统计表格设计 Delphi文本和图形的打印方法 Delphi应用程序中中国式报表的制作 Windows环境下实时列表输出的实现方法-Delphi资料 报表制作技巧(二)-Delphi资料 Delphi编制的程序运行中动态制作报表 Java Developer Interbase如何自动保存更新 请教数据库连接池的使用.... 不要以为你不骂人你的素质就比那些骂街的高了,如果你卖国那么你的素质比那些骂街的更低,因为你基本不具备一个人的素质了 哪位有有关Vtune的相关资料呀,提供链接也行,最好是指南一类的,3X。 编程几年了,没有希望,想改行,你们呢? 有谁做过“文物馆的文物或藏品综合管理系统”如能提供资料或动者!本人感谢! 入门时奇怪问题? 如何把*.IMG文件转换为JPG文件? 其实你不懂我的心 那里可以买到microchip的mcp2150 ,(要现货),比较紧急,请帮忙 关于对2进制文件的操作 将去做SAP ABAP4平台编程,用过的请进。up有分。 C的图形问题? 为什么我点进去看不到内容? 如何考中程 数据窗口控件为dw_6,其间的对象为D_PUR,我想使其中的图片框的VISIBLE属性变为FALSE总是有错误,请教:)在线等待 kylix2在RedHat7.2下的安装问题? 能告诉我吗????各位哥哥指点一二 数据库置疑问题,并不难?请进 关于串口通讯(向手机发送AT命令集) 高手请看:表格的终极问题 如何得到treeview中选中项的标签或内容? 在哪能下载到FOXPRO2。0(FOR DOS) 请教高手!我没多少分了,50分给你! 怎么办? 谁救救我啊,怎么办? 对已生成的窗体缩小和移位后,恢复原始状态遇到的问题 字段中如何存入一个回车和换行符? 一个MYSQL的问题? PFC编程的那几个PBL库 我这里怎么会没有 请教高手 求最佳算法,谢谢,考试题目,请各位大俠务必帮忙,跪谢! 神阿,救救我吧! 求教高手!关于installshield的问题!我就50分了,全给你! 我号帐号的Email是eColdBlood@csdn.net,好玩吧?! 在COM编程中,PROXY/STUB到底怎么解释为好?谁的COM厉害请解答! 兄弟们帮忙,一个MM让我猜谜语!! win98 序例号? 关于struts的问题 关于变量的问题 想开发路测系统,如何最简单实现 GIS,GPS 最简单功能。欢迎指导 美女求救,谁答的好就嫁给谁!! 用Delphi做类qq聊天软件! 用命令行使用Visio2000 随便写写 设置Form那个属性,能使程序运行后它的窗口是隐藏的? 有谁知道哪里有LINUX的安装程序下载,国内网站的 给女同胞的~~~~~~~~~ 用ASP怎样在客户端运行程序? 能否在ISA Server上设置NetMeeting的端口映射? 帮帮忙!我的服务器在局域网中不能访问。 北方建设一亩大养鱼池需要多少钱 谁有麻辣烫底料的配方?请教有经营麻辣让的大虾们,我是一个准备着手麻辣烫行业的新人,(是那种串串香,穿在竹签上煮的哪一类),但是对这一方面毫无经验,请教有经验的大虾们,你 坍落度起什么作用 我有2亩鱼塘不知道养殖好?收益怎么样? 细胞的物质和能量储存在哪里 坍落度160是什么意思 浅谈如何改进高中英语语法教学 动植物细胞中的储存能量的物质是什么? 坍落度是什么? 线粒体是有氧呼吸的主要场所.下列关于线粒体结构和功能的叙述,正确的是()A有氧呼吸酶主要分布在线粒体的外膜、内膜和基质中B线粒体可以再有氧条件下将葡萄糖氧化分解为CO2和水C线 兔子细胞中储存能量的主要物质是? 0元 中国电信 中国联通0元购机 线粒体是有氧呼吸的主要场所,下列关于线粒体结构和功能的叙述,正确的是A有氧呼吸酶主要分布在线粒体的外膜、内膜和基质中B线粒体可以再有氧条件下将葡萄糖氧化分解为CO2和水C线粒体 动物 植物细胞的储存能量物质是什么 iphone的联通版电信版是什么意思? 用生活中的具体事例说明"人人为我,我为人人". 高中物理加速度图像11.某矿井中的升降机,在开始3秒内,以1米每秒方的加速度,由井底从静止均加速上升,接着以3秒末的速度均速上升6秒,最后均减速上升,又以2秒刚好停在井口,试画出升降机的a 关于风景的好句好段好词关于自然风光的好句好段好词,都行,只要快一点! 线粒体是有氧呼吸的重要场所吗 如何用三种方法使得木材中的纤维素、半纤维素和木质素的稳定复合物降解,从而利于纤维素酶降解纤维素 MATLAB中for循环变量值不增加for i=1:mfor j=1:nif (i-10>=1) && (j-10>=1) && (m-i>=10) && (n-j>=10)A=I(i-10:i+10,j-10:j+10);[mm,nn]=size(A);Arow=ascend(A,1,mm*nn); %排列矩阵A中元素[b1,b2]=boundryvalue(Arow); %函数a=select_noise(A,b1,b2 人人为我我为人人的具体事例 长春哪家小型货车改吊车载重车 听说那个新开的书店很没有书 修改病句请用汉语知识 或者语言学相关知识 找出病因 世界上有多少种海豚?谁也是喜欢海豚的? 基因是Dd还是D和d 求推荐几种小型拉货车的型号,要求如下:①柴油动力;②,载重0.5-1吨;③普通三轮车大小,急用! 太阳内部温度有多高? ,D表示显性基因 我想问能否用DD表示一个显性基因 就是DD 纯合子 可否写成DDDD 求大手 4.2米货车载重2吨以下什么车好 多少钱 太阳的表面温度有多高? 基因组成是Dd的,d控制的性状是什么,但d还会____? 生活中“人人为我,我为人人.”的例子 为什么太阳外部温度比内部高? 生物书上表示基因一会用Dd,Bb,Aa一会又有用Rr,Hh,XaY烦的很!使用这些这字母表示基因有什么准则吗?每...生物书上表示基因一会用Dd,Bb,Aa一会又有用Rr,Hh,XaY烦的很!使用这些这字母表示基因有什么 除杂草用什么除草剂比较好我家院子到处都是杂草,除掉 拔掉还继续长,而且越长越多,以前也用过除草剂,效果不怎么好 原来,德国的选举制度与英国、美国一样,分为两院制:联邦议院、联邦参议院.德国联邦议院议员由普选产生,德国联邦参议院议员则由各州政府官员作为代表组成 英国的“上院”和“下院”是怎么回事 鱼塘怎么消毒大家都知道,海南最近洪水肆虐,现在更紧急的洪水后怎么办,水产养殖受到了很大的影响,鱼塘要怎么消毒呢如果再重新放入鱼苗?有什么注意事项? 下列各国议会,只起到 "修饰门面" 作用的是:() A 英国上议院 B 美国参议院 C法国众议院 D德国帝国议会 各位大侠问一问,英国的上院和下院的权力谁的权力大,为什么?还有不是内阁首相由议会多数党领袖担任吗?如果议会多数党一换是不是首相也就跟着换,最后一个问题是议会通过对政府的不信 石灰放入养鱼池内能消毒吗? 英国历史上有那些王朝?每一个王朝的起止年代和简要说明. 议会的上院,通俗易懂些 水泥鱼塘放养之前用生石灰消毒过了,那在养的期间还要消毒吗,如果要,要用什么消毒, 左撇子基因在什么染色体上?是显性还是隐性?请有依据,如:出自什么书等. 麻辣烫底料配方\汤料配方? 现任德国总理,法国总统,意大利,巴西,澳大利亚,加拿大,印度,英国最高领导人分别是谁? 一对同源染色体上有一对显性基因和一对隐性基因,对吗?http://zhidao.baidu.com/link?url=G0PpnX6-AC9-U6AEzGreloRjNgvCvO4h_fGgnreU5Xu1wr2yjXtfvW9exF8yQTsLkLAa_S09r4sX1Mu7ypCFfK这里采纳的回答是这么说的 英国议会的上院有什么职责?两党和元首都从下院产生,那上院呢? 我国最早的农业的来历 为什么说一对显性和隐性基因位于一条染色体是错的? 麻辣烫底料配方是什么? 麻辣烫砂锅底料的做法我自己开了一家麻辣烫小吃店,但是味道不好,看到别家做麻辣烫时放一小块麻辣烫砂锅底料,有谁知道是怎么做的.yangguoqi1230这位朋友,请不要把网上的东西给复制过来,如 请问 常染色体上、 X染色体上与Y染色体上的隐性与显性基因控制遗传病的各自特点是什么?谢谢 串串香 底料配方 或者是技术学习的也可以哈 称小火锅的四川麻辣烫汤底怎么做 川味麻辣烫做法”串串香“有名“麻辣烫”,它实际上是火锅的另一种形式,所以人们往往又称它为小火锅.“串串香”最早出现在二十世纪80年代中期的成都. 如何有效地进行高中英语语法教学 细胞中的物质所储存的能量是什么?这里有四个选项:A.B.机械能 C.热能 D.光能 我是实在不想想了, 坍落度试验怎么做?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘