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

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

2014年11月操作系统份额:Windows 7雄居第一,XP跌新低 微信开放平台上线统计报表功能 【向导】如何开始学习高伸缩性编程? 基于Apache Samza,揭秘LinkedIn架构背后的技术 Aeron:每秒可以传递数百万消息的低延时开源消息系统 英特尔物联网马拉松:用创造力改变生活 年末总结:2014年全球手游市场发展的六大趋势 Saber——模块化、组合式的移动前端框架 什么仇什么怨?还原日本反美颜应用Primo真面目 横跨2D与3D!专属C#开发者的超强游戏引擎Paradox 首份“2014年移动外语学习行业报告”等你下载 《近匠》Ayla联合创始人张南雄:物联网发展的三个阶段 神器 VisuAlgo:通过动画学习算法和数据结构 【工具推荐】QWrap——开源的前端JavaScript框架 老外看中国:移动应用UI设计的十大精髓 HTML5正名记:两家机构的博弈与一种标准的诞生 电池技术为何停滞不前?革新技术尚未出现 如何设计优雅的移动游戏? 前方高能!盘点2014年最颠覆三观的智能硬件 俄罗斯当局封杀GitHub,理由是教唆自杀 裁员110人、关闭工作室,Rovio重组求出路! 全Swift开发、代码开源!有钳的Firefox for iOS 详解开源游戏开发框架HaxePunk的主要特性 《程序员》杂志休刊通知 2014 TOP50最具价值CTO获奖名单揭晓! TIOBE 2014年12月编程语言排行榜:R和Swift成为年度语言候选者 免费增值应用正在“杀死”游戏开发者? 直接Mark!开源的DevOps开发工具箱 Apache Mesos联合创始人Benjamin Hindman:谈分布式应用现状 直觉不靠谱!使用移动应用分析的七个巧妙方法 屏蔽、挖角与丑闻,Uber的“创收神器”泡沫 骆驼您好,刚才没看到你的回贴的时候,那个贴我已经结贴了,我还有问题请教,请进,多谢。 请问哪里有VTune Profiler下载?据说它能分析VC代码中各函数所占用的开销 请问如何在ftp上收发xml文件。。。请具体点告诉我或贴源码或贴相关文章地址 文件解析 VC的OPENGL编程显示提示框时,显示内容是以前绘图的,不是最新绘图的,怎么办? 请问为什么create table bbb as select * from aaa ,aaa上面的缺省值还有索引都掉了呢? 如何在数据库里存文本文件? 用什么工具可以查看内存是否有泄露, Win2000上是什么, Win98上是什么 为什么用oledbadapter不能更新数据库阿? 软件陷阱问题 请问哪里有VTune Profiler下载?据说它能分析VC代码中各函数所占用的开销 在weblogic7.0上面jsp文件运行问题 请教关于打印遇到的问题 谁能个--报表例子(水晶报表。vb.net)--报表的数据源要是动态生成的。 利用WMI管理WINDOWS 请教:如何在chm帮助文件中执行应用程序。谢谢 Weblogic+Mysql的Jsp/Java程序的数据库该怎样连接?? 在java代码中引用php的变量?请问如何写? tclientdataset问题 急!!!!VFP触发器取值问题 怎么样才能卸载REDHAT8.0下的XMMS,而装7.3下的XMMS? 请教一个有关于对话框上控件重画的问题!谢谢! 有谁知道上海高程查分方法?急!!! 请教OleDbDataReader的用法 请教一个有关于对话框上控件重画的问题!谢谢! 请教一个简单问题,显示图形滞后的问题,有人回答过,但不正确。谢谢 大家有没有见过IIS不支持数据库的? 1700--2100 之间的手机,请大家帮我推荐一下,在NOKIA,MOTOROLA,厦新,波导……中选择!! 请问谁有?divx的资料?能提供下载也行! 请问如何把从数据库中读出来的数据显示在在线编辑器里? 请教:log,乘方(pow(x, y))运算用C语言如何实现? 如何在Domino designer中添加图像资源,在线等候 所有分求asp2dll破解版,急!在线等待!! zhwdan 还是朋友!多谢你了!快来看看啊! 多文档程序,怎样在选择某一菜单命令时使窗口最大化且不能改变大小,而不是在PreCreateWindow函数中设定?在线等待 LINUX 好多问题呀! 给高分 html文件在Unix系统下有大小写之分吗??我只知道他对CGI有大小写之分。在线等待。 在线等待 怎样使单文档程序中间凹下去的部分 变成 不是凹下的,使得整个界面看上去是一个平面的~~~谢谢~~~ 存储过程怪问题 哪个更划算? 关于delphi的ISAPI开发 用标准的C++怎么样才能调用Win系统API? 一点看法 自动运行的程序!!! 月薪2000加提成,怎么样? 请各位兄弟帮个忙 谁有JAVA与模式的电子版? 怎样更改一个按钮的标签?怎样知道我按的按钮是哪一个?(答对结帖) 请教关于远距离局域网连接的问题 如何遍历DataList中的TextBox? 女子整容成范冰冰照片曝光 网友惊呼:《中国好声音》哈林“野兽团队”狂舞 “好声音”今晚改编很颠覆 西北风改编第8届首尔电视剧大赏红毯 吴奇隆帅气哈林队导师考核结果猜想:网友最希望金胡歌白冰曝恋情 白冰心情大好晒美照女星70万购假包 揭秘女星天价包包文章耍大牌丑事曝光 小爸爸:“我杀你吴彦祖反串跳芭蕾“肌肉版”小天鹅笑死好声音哈林组导师考核精彩学员抢先看蘑菇兄弟VS戴荃 大胆改编《妹妹你大《兰陵王》郑儿毛林林华丽写真 告别蛇好声音哈林组导师考核明晚收官 90后好声音梦想导师ELLA太抢戏 庾澄庆新《神雕》演员定妆照曝光 张馨予版李“好声音”在台受追捧 即将亮相台湾中好声音上演旧曲新编 哈林分组选曲改编孙杨向观众鞠躬不慎掉进泳池 萌死啦花样游泳文婷姐妹含泪退役 点滴记录赛盘点巴黎时装周打酱油的明星 精心装扮郑爽杨幂《古剑奇谭》横店拍摄花絮照女足世界杯江苏小妮成焦点第B13版杨旭: 忘掉鲁能的不快汪涵般的口才立即启动长江江苏段搜寻工作老戏骨们撑起爱情热剧愿逝者安息峡湾狩猎小宝的遗传哲学杨旭: 忘掉鲁能的不快欧文骨折赛季提前报销 詹皇坚信骑士逆香港江苏社团总会访问团来我省考察女足世界杯江苏小妮成焦点南师大新传院迎20年院庆曲奇饼果真曲折离奇全省多地督查高考考生就餐食堂大四班的毕业歌为了能和你 愉快地玩耍马云获颁台湾师范大学名誉博士第四届中美韩泌尿外科、男科新技术峰会唐山面向高校大学毕业生及社会招收首批
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘