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

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

难逃厄运:Zynga将关闭Draw Something母公司OMGPOP 直接拿来用!最火的iOS开源项目(一) 是时候抛弃Eclipse转向IntelliJ了 Arrow:轻量级的Python时间日期库 编程语言API,你最青睐哪一款? 推动新输入方式发展:英特尔为感知计算设1亿美元基金 AWS到底有多大?目前看来有158000台服务器 C语言实现树的动态查找 第五届中国云计算大会于北京隆重举行 改变企业移动化:新Google地图API支持用户定制 诺基亚旗舰手机EOS真机图曝光 配备“巨型”摄像头 走进豆瓣:豆瓣的技术架构与团队文化分享 加速Web开发的10款HTML5工具 微软式微?AMD、英特尔等开始疏远Windows 语音技术现状:四千万突破语音产业的技术壁垒? 万维网联盟W3C推荐Web性能API 微软郑子颖:Windows Azure如何支持开源系统和软件? EMC 叶成辉:软件定义数据中心实现统一、开放的管理 百度云主任架构师 侯震宇:云终端开启数字生活 中国工程院院士 倪光南:中国云计算在全世界份额远超3% 信息图:未来的企业移动培训应用与技术 “2013年度中国优秀开源项目征集”活动最后三天 为什么开发者倾向于使用杂乱无章的免费工具 EMC合作伙伴销售经理杜术清:实现云的三种途径 开发者想走向海外:你融入老外的圈子了吗? 前微软工程师:美国监控和直接访问服务器?这不太可能 代码、TDD速查表 如何选择前端架构:服务器端HTML vs. JS部件 vs.单页Web应用 世界上最高深的Android特洛伊病毒 招聘iOS开发,老板必问的5个问题 护航科技吴伟湘:IT离线安全体检服务将带来颠覆 如何对APPLET存档? 请问这样一条select语句(包含compute)的查询结果怎么显示在屏幕上? 请问如何实现一个类似于工具提示的小窗口,并控制它的显示,或者怎样让工具提示窗口一直显示 请教各位高手关于对象序列化的问题! 现在很急切,多谢各位! 送分:如何求一个已打开ADO记录集中当前记录的行号或索引? enhydra4.0+jbuilder4.0+kelp4.0. 类型不匹配? 请教各位高手关于对象序列化的问题! 现在很急切,多谢各位!-- 请问这条select语句(包含compute)的结果如何显示在屏幕上? cn类型不匹配? 请问高手: 如何在VB.NET中调用象GetObject那样的函数 300分!!急急急!!各位大虾有提供关于报表的控件带源码的 请问各位大侠,怎么用批处理的方式开启一个后台服务程序? 如何对access文件加密!!!! 再次送分:如何求一个已打开ADO记录集中当前记录的行号或索引? 急!急!在用户界面线程中,如何接收其它窗口发送的消息? 我的toolbar潜入一个对话筐怎么是灰的???? :)请问:网上能不能找到破解了的Pro-e2000(中文版)啊? 关于退格键! java与C的问题,怎么办? VC里如何调用std里的operator new和operator delete 有沒辦法使成員函數只供指定的 class 呼叫! 关于DELPHI中的DBGRID控件 关于enhydra4.0+kelp4.0+jbuilder4.0。 能不能用Mscomm控制并口,如果行,应该怎样将一串ASCII值发送到并口;如果不行,能用其它方式吗?(最好能提供例程)多谢了。 求救,请教ado中有关事务的问题。 异想天开的问题???,进来就给分!!!! 请教高手,我如何将*.swf文件从网下摘下? 集线器与交换机怎样级联? 请问如何用RasDial 类似冰河“搜索主机”的功能怎么实现啊? 如何利用socket截获80端口数据?请给出源代码。 水晶报表的问题 Help的窗口 送分:关于数据库中的数据在前台显示的问题,敬请高手指教 请问一下各位PB FANS,PB中的自定义事件中的extenal选项有何作用? Label的小问题,以后给分,现在确实没分了。 测试a 有沒辦法使成員函數只供指定的 class 呼叫! 请问如何给listview添加鼠标拖拽功能,如从本视图中拖走一行? Jbuild and Visual Age for Java 只使用数据库表单如何不带环境? 为什么在Cmd.exe 下可以运行,但是在ASP里面却没有办法写进数据???斑竹怎么只提供4页的讨论内容呢?? 救急,启动winNT时候inetinfo.exe总是共享冲突,该咋解决? 如何防止内存泄漏 帮忙看诊断一下遇到的问题。 Fatal error C1010: unexpected end of file while looking for precompiled header directive是什么意思?怎么改正? 关于数据窗口 D3D8的疑問 作动态连接库链接时出错? rLabel的小问题,以后给分. 就是实验题回答的那些 干燥剂(硅胶)遇水以后为什么会弹起来? 食品干燥剂遇水真的会爆炸吗 亚铁离子与硫氰酸钾反应据说生成物是蓝色的! 二价Fe和S离子是双水解还是生成沉淀 各价态的铬离子的颜色及化学式是?求可靠回答. 月季花汁和玫瑰花汁遇白醋、肥皂、苹果汁分别变成什么颜色? 不同成分的干燥剂遇水反应是否会有不同? 求各个价态的铬的化合物或离子的颜色例如(Cr2O7)2- 为橙色等等越多越好,谢过了 为什么白醋、肥皂水能使月季花汁和玫瑰花汁变色?鸡毛信急! 干燥剂遇水会爆炸吗? 二价铬是什么颜色 硫氰酸钾和氯化铁溶液反应方程式怎么写? 干燥剂为什么遇到水会跳?干燥剂是"雅客益牙木糖醇"里面的,是透明的小圆珠,我把这些干燥剂全部防竟烟灰缸,然后加了一些茶水,它们就全部都跳了起来,它们会不会和跳跳糖的成分一样啊? 铬酸根离子什么颜色 谁有初中化学基本实验操作复习题呀? 干燥剂和水的反应.急用! 科技创新创意方案 1水无色,为什么结成冰变成了白色?2高空中的水蒸气是无色,为什么凝华后变成的雪是白色?3空气中是有水蒸气还是有水蒸汽? 向下排空气法的适用条件除了对气体密度有要求外,对试验装置是否也有要求?是不是只有如图的装置才能用?如果把如图装置旋转180°,是不是就不能用向下排空气法了? 求一个初中物理创新实验方案 为什么瓶子里冻的水变成冰是白色,而不是透明的··· 三、初中化学:提出实验方案?设计一个实验,能通过清晰可见的现象,除去氯化钙溶液中的少量稀盐酸,请写出实验操作过程、现象和结论? 水发电是什么原理?无色无味,还可以喝,红色液体不会导电,手摸了也没事.大哥大姐们,帮一下,解答一下. 证明空气存在(用家中日常物品) 彩色的水冻出来的冰为什么是白色或透明的?冰可能是彩色的吗?望正解,科学理念之类的. 如何针对初中化学总复习制定方案? 初中化学人教版有哪些家庭小实验 三价铁离子不能跟哪些离子共存要全一点的 盐酸可以用来分离三价铁离子和铝离子么? 家庭如何购买初中化学实验仪器 碘离子为什么不能与三价铁离子大量共存? 为什么铁与盐酸反应生成二价铁,铝与盐酸反应却生成三价铝?不是具有强氧化性,才能从零价氧化成三价? 三价铁离子、硝酸根离子、氢离子在水溶液中能否大量共存? 字数不要太多,浓缩才是精华,要分类说明,最好有口诀. 三价铝离子与水反应的方程式 有哪种无色透明化学试济遇水显颜色? 钠,铝,硫,氯离子半径谁大谁最大,谁最小 什么和什么离子对铝片和盐酸反应无影响 用什么化学物质,平时无色,见水可显黑色呢 正三价铝离子和负二价硫离子的离子半径哪个大? 干燥剂遇水多长时间爆炸 笨铵皮为什么遇水颜色变深 . 钠离子,镁离子,铝离子,氯离子,硫离子等半径由大到小顺序排列?为什么? 初中化学 这几个都要 硫氢根与碳酸氢根是否反应H2S+(CO3)2-==HS-+(HCO3)-剩下的不继续反应了吗 初中化学家庭小实验要有过程 正一价钠离子和负三价的氮离子谁的半径大 碳酸根和碳酸氢根反应的离子方程式 Fe(OH)3溶于氢碘酸的方程式怎么写?碘离子会不会把3价的Fe的铁还原成2价?Na2S2O3溶液中通入足量的氯气化学方程式怎么写?氢氧化铝中和胃酸的方程式怎么写?过量SO2通入NaOH溶液中化学方程式NaNO2 初中化学,谢谢谢谢谢谢 二价铁和碳酸根,碳酸氢根,亚硫酸氢根,偏铝酸根反应的离子方程式 “蛋壳溶于食醋放出气体”这个实验谁能说的详细一点啊 钠离子与氮离子哪个半径大 二价铁和硫氰酸钾反应有什么现象?注意,是”二价铁” 氧化还原反应Fe+S==加热==FeS,书上强调用干燥的试管当反应器皿,为什么要干燥?想不通~ 氮离子有哪些价态 硫氰酸钾与三价铁离子反应有无沉淀生成能在溶液中共存吗? 二价fe离子水解吗? "Na3N中钠离子与氮离子半径相等"为什么错
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn