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

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

Unite2014大会:移动开发者的饕餮盛宴 玩与学并存 Kano kit让你自制Raspberry Pi电脑 【BDTC讲师】Hortonworks Gunther&Ted:HBase、Stinger的发展与实践 人人网推出开放平台2.0 多项重大改进吸引开发者回流 红帽高管:将Linux价值理念和做法延伸到OpenStack Fundation 5发布:号称最快版本,响应式用户体验更完善 程序员远程工作必会编程语言JavaScript 苹果确认收购3D传感技术公司PrimeSense 从电影《饥饿游戏》里学到的IT知识 细数IE11的七大变化 2013中国大数据技术大会,你不可错过的10个理由 Unity 2D全球发布,开发者梦想照进现实 Kraken:改变PayPal开发文化的Node.js框架 微软高管:我们将不会再有三个Windows平台 中兴明年推智能手表 暂只能与自家手机搭配使用 移动开发必备!15款jQuery Mobile插件 Chrome新变化:在地址栏里增加搜索按钮 电信行业大数据实践走进大数据大赛:电信网络寻呼黑洞分析 京东云开发者沙龙(北京站):“千人千面”的机遇 小工具、大能量——2013移动开发工具调查报告 人人网重新布局移动社交战略 专注学生群体发布新版移动客户端 谷歌把“OK,Google”带到Chrome 让PC也能便捷语音搜索 美国女性工程师远没有你想象的多 技与艺:对话《雨血》系列制作人梁其伟先生 2014年平板电脑或将占PC市场的“半壁江山” 【开源推荐】Nutz:Java项目中SSH框架的最佳替代品 你的数据库准备好过冬了吗 开源将成为SDN最大的风险! “大姨吗”CEO柴可:女性健康白皮书的发布与“大姨吗”的未来 看中国大学生的移动创意激情 第六届英特尔杯软件创新大赛侧记 在哪里工作更好?Facebook大胜Google 急,在线等待 DNS服务器的问题,高手救命!!!问题解决不了,老板要我走人了!!!!!(痛哭中 &&&&&&&&&) 鼠标当前位置的值与窗体位置如me.left 的值是怎么样换算的? 英文OS,我加一个中文字库,我要在我的程序中显示中文,该做些什么? 一个硬件问题,来看看吧!问了好多人多不明白 bcb6自带的install??? 简单要求 CSDN出的《JBuilder实用技术手册》到底怎么样呀?我看目录怎么像垃圾? 在jsp怎么取得用javabean连接得数据库中得记录总数 请教各位大师,如何用VB做一个象ComboBox一样的控件 web Service里的Application的问题 有没有能够打印固定行数的报表? 对XML不太熟悉,麻烦大家再看看! 关于bho及控制ie行为的问题, 如何动态的设置datawindow的计算域的表达式,及从程序中如何得到该计算域的值 [我贴我灌]巴塞罗那凯旋归来 “花样姑娘”泪洒观澜湖 一个到现在还没有解决的问题!我着急用啊!请哪位高手帮忙解决了,有高分相送! WIN32 CONSOLE APPLICATION 中怎么调用DLL (动态连接库) 怎么增加不了行,插入不了了?请大虾给个提示 50美元求作业! 如果没有学过C语言,能不能学J2SE啊? 100分请教:一个串行接口通信的问题————在线等待?!!!! 急,给个jb8中解决编辑jsp问题的补丁。谢谢 关于sendmail的设置以及PostNuke的安装 关于XML,XSL的兼容性问题 在SQL SERVER的视图不支持CASE语句吗?若要实现该如何写呢? 现在最标准的软件开发预算,各阶段的百分比是多少? ==========天哪!怎么会这样呢?我在全屏窗口中打开的任何窗口都是全屏显示的,可我不希望在全屏幕窗口中打开的窗口也是全屏怎么办啊?== 如何在远程服务器上安装web服务程序? 考虑到类的属性(表的字段)以后会增加,应该用怎样的设计模式或设计方法。 如何在子目录下获得根目录的网络路径? 急,IE每次打开都是最小化状态,怎样实现每次打开时将其最大化! 希望和大家讨论一下关于WebService的事务继承性的问题 请教一个关于日期使用的问题 急!!一个建表问题 WSAD怎么显示代码行号?? 50美元求作业!access 有没有能够打印固定行数的报表? 请教接收视频信号的问题 VBscript转换为JScript? treeview的初级问题(解决立刻给分),关于节点的OnSelectedIndexChanged事件? 如何知道Clientdataset中哪些记录改变了? 如何构建Access数据库? 有没有soap client for ce 呀? 关于在不同环境下的时钟问题!!! 关于在一张图上标识位置的问题 vs.net 2003的msdn 安装好后为何不能使用? 如何在asp中post一段xml包到一个地址 vc1.0编译的问题 怎麽在Jbuilder中调用带参数的ORACLE数据库中的存储过程 如何用VB来写配置IIS的程序? 什么是生物能,什么是生物质能?二者有什么区别 雨字头下面一个沐念什么 雨字头加沐念什么求大神帮助 一个雨字头一个林念什么? 市场开拓定义和原则是什么啊 home depot中的depot是什么意思? HOME DEPOT怎么样 广州the home depot验厂 为啥人类没有翅膀呢大神们帮帮忙 毋意,毋必,毋固,毋我. required in原文如下:electric socket adapter(if required in regoin)翻译:电源插座适配器(如果环境需要),但我查遍了字典,也没有发现regoin 叙政府称:日内瓦会议旨在让总统下台则挪威一公交车遭持刀男子挟持 造成3人博尔特自爆在北京拒吃中餐 吃了100穆尔西拒穿囚服出庭高呼口号 庭审被迫温州三名年轻女子失联谜案 子女离家家浙江青田男子网络上扮富二代骗女子钱浙江体院:孙杨多次违纪 早就想处理他男子持刀入室抢劫女子 原是其前夫一手义乌一家箱包厂四楼着火 消防及时救出金东查获1000多万元假减肥药或引发义乌打工男子联合女友从其追求者处骗钱陕西推行“阳光司法鉴定”新机制青海保障师生“舌尖上的安全”司法部负责同志就《最高人民法院最高人嫌疑人建3个制毒工厂制毒2.791吨婺源森警启用无人机护林人民法院公告京津冀六成旅游线路仍存强制消费进一步加强社区矫正工作衔接配合管理强化接兵人员廉洁自律意识尊重当事人意思自治人民法院公告
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘