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

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

探讨高效的排序合并算法-VB资料 剔除INI文件中的注释部分-VB资料 提取可执行文件中的图标-VB资料 添加记录到文档菜单-VB资料 突破 SendKeys 的限制-VB资料 突破SendKeys的限制 -VB资料 圖面背景透明的技巧-VB资料 退出并关闭 Windows-VB资料 托盘程序详解(二) -VB资料 托盘程序详解(一) -VB资料 我怎样确定我的程序是否在运行?-VB资料 无重复随机数序列产生器 -VB资料 显示打开方式对话框建立文件的关联 -VB资料 显示动画鼠标图标-VB资料 修复VB5启动时可能出现的一个bug 修改IE的环境菜单-VB资料 修改安装向导生成的缺省安装目录 -VB资料 修改屏保口令 -VB资料 修改屏幕保护的口令 -VB资料 旋转字体 -VB资料 延时函数-VB资料 一个关于乘法溢出问题的探讨 -VB资料 一组VB实用小程序 一组VB应用技巧 隐藏和显示任务栏-VB资料 应用 WSH 读写注册表和建立快捷方式 -VB资料 VB用 IIF 和 SWITCH 以精减代码 VB用BASIC语言设计Windows风格的用户接口 VB用Form 的 Mouse_Move事件来检查鼠标是否在窗口内: VB用RND()函数加密 VB用SendKeys来捉屏 大家快来帮忙:数据库的一个小问题 我现在想学一门新技术,不知道是学VC++,JAVA,还是刚刚出来的。NET技术呢?请高手指点呀。 高分征解:一个动态提示窗口的问题,给出答案必定给分!!!求救我啊!! 在这里赚分真不容易呀! 怎样检查FORM中CHECKBOX和RADIO的值呢 那里有在asp中操作word对象的详细教程? 请问:如何得到TForm的窗口句柄? authorware中的按钮。 哪里有发送mail成功的php程序!! 关于上传数据的一个特殊问题,有点难 怎么用OLE实现与手机的通讯?? 汉语分词算法 grid显示问题 成为Delphi高手须看哪方面的书籍,请高高手指教? 关于属性页的小问题? 为水园增加点正气: 大家都是斯文人吗,呵呵||||| 诗经国风2001版----之桃夭 高手高手教教我 +++++++++++++一个很奇怪的问题************* 请问:有没有专门介绍C++函数使用的书籍? 提個有點難度的問題.看問題的有獎. 高手请看:这语句错在哪? 哪儿有dos的原代码? 谁能平息这几天水园的争端^^^^^^^^^^一个详和的水园^^^^^^^^^^^我只能拿分支持 为何显示黑乎乎的一片,chick!!!!!!! 原来女人也好色,欢迎MM。 心芯蕊~来拿分~~~~MM要分能不给吗??砸锅卖铁也要给啊!~~~~55555,可怜我的分啊~~~~~~~~~~~ 着急??一小段代码!!谁来看一下?? 男子汉说到做到,我在此特地向一位女士道歉 高分求救!急急! ! ! ! 奇怪,编译DIRECTX例子正常,新建一工程后改写主文件后运行BltFast函数为何这样? 急求高人!不简单:关于common dialogbox控件的问题? 怎样学可视化编程? 用Jmail收信后,为什么WORD之类的附件打开总是乱码?? 请问如何使用BCB中的PageControl创建Wizard? 别人跟的帖子也应该能回复呀! Rational Rose2000 Enterprise Edition的License Key是什么? 哪位好兄弟肯给我一个Jbuilder4的序列号? 就有两个月了,还没怎么看书,不知道能不能过高程!!! -------我和我MM系列(转)几乎是完全版 有MM和没MM的都来看看吧 当然MM也可以看~~ 建议:在此开设一个程序之家聊天室。 请教一个简单问题!! 请问各位:如何显示GIF图像??? 最近水园很没劲,看样子是要离开的时候了,虽然我来的时间不是很长。唉,为什么会这样? 这几天晚上我都会在263战网 谁能 提供超大空间 用于上传PB80光盘 月末,大富翁银行将作月结,如果跟本银行还有业务关系,速来通知 用ado怎么连接excel文件,不用odbc行吗? 软驱自动保存是怎么一回事情 请问各位大虾,在VB中,怎样才能改变PictureBox或Imagebox的形状,让它可以容纳圆形的图片.或者用其它方法实现对不规则图片的操作.比如我编了个网络象棋程序,怎样用一个PictureBox来容纳一个圆形的棋子. 请大家帮忙一下拉。http://www.csdn.net/expert/topic/216/216983.shtm 我真急啊 有知道 MPG4 格式的吗?告诉网址也给分!!! k2cr2o7+naoh 颜色为什么不发生明显变化 _K2Cr2O7+_H2SO4+_FeSO4=>_Fe2(SO4)3+_K2SO4+_Cr2(SO4)3+_H2O HNO3电子式怎么写? h2so4环境下,k2cr2o7氧化h2o2颜色变化过程我做实验时逐滴加入H2O2,溶液先变暗绿色,渐变成亮绿色.应该是三价铬吧?为什么会不同颜色? C+K2Cr2O7+H2SO4 ------ CO2+Cr2(SO4)3+K2SO4+H2O 配平 硝酸的电子式是啥呀? 为什么K2Cr2O7,KMnO4颜色比CuSO4,FeCl3等深得多?(K2MnO4的灰绿色颜色也很深,但经不起稀释会歧化)我一浴缸水加了几粒KMnO4(不超过0.1g)结果整浴缸水都变成紫红色了K2Cr2O7,差一点,但稀释10000倍还有 K2Cr2O7+ H2C2O4+ H2SO4 — K2SO4+ Cr2(SO4)3+ CO2+ H2O HNO3的电子式怎么写? K2Cr2O7+Na2SO3生成什么 K2CR2O7在反应中得电子怎么算啊详细点 K2Cr2O7+H2C2O7+H2SO4-----K2SO4+Cr2(SO4)3+CO2+H2O求高手配平...小弟拜谢...最好带过程... 铜与硝酸反映,如果有1MOL电子,转移,则被还原的硝酸为多少A,63G B.21G C.0.5MOL D.不确定 K2Cr2O7怎么读?有奖征询,奖积分,走过看过,不要错过望各位大侠,助小女一臂之力,大恩大德,没齿难忘 Cr,K2Cr2O7,Cr2(SO4)3,CrCl2,Cr2O3,ZnCrO4这六种物质中铬元素显化合价的有哪些?请说明理由, 镁和稀硝酸反应时,每有1molHNO3反应,就有0.8mol电子转移,此时硝酸的还原产物可能是 化学问题K2Cr2O7读什么?2和7都是下标 与K2Cr2O7的Cr的化合价相同的氯化物的化学式是什么 如图,已知A、B、C三点不共线,求作一点P,使PA=PB=PC. KClO3 Kmn2O4是什么的化学式 高中化学.k2cr2o7怎么念?了 KMnO4求化合价Mn H2O2、O3、SO2、HClO中漂白品红原理与其余三种不同的是 化学方程式配平:()K2Cr2O7+()Fe3O4+()H2SO4 与K2CR2O7中的CR的化合价相同的氧化物化学式 Cl2,ClO2,O3,H2O2中氧化性最强的是咋算的呢?( ⊙o⊙ K2Cr2O7+H2SO4+(NH)2Fe(SO4)2-->请帮忙完成反应方程式并配平 如SO4 CO3 NO3 PO4 CLO3 SO3 这类是否有方法记忆其化合价 背了好久还没背出举个例子就行如SO4如何记忆 Cl2,O3,H2O2的氧化性比较RT,并且如果要是夹在常见的氧化物里面,如何加进去? 配平K2Cr2O7+KI+H2SO4---K2SO4+I2+Cr2(SO4)3+H2OK2Cr2O7+KI+H2SO4---K2SO4+I2+Cr2(SO4)3+H2O OH,NO3 NH4 SO4 CO3 PO4 MnO4 ClO3 是什麼根?我只知道 MnO4 是锰酸根. 过氧化钠、过氧化氢、NaClO、HClO、ClO2、SO2、O3、活性炭等物质与漂白粉的漂白原 配平 k2cr2o7 + ki + h2so4---k2so4+ cr2(so4)3+ i2+ h2o 某透明的溶液,其中只可能含有大量的K+,Cu2+,OH-,SO3 2-,Cl-,CO3 2-,HCO3 -,MnO4 -,SO4 2-①测定溶液的pH,溶液显强碱性;②取少量溶液加入稀盐酸至溶液呈酸性,产生无刺激性、能使澄清石灰水变浑浊的气 HCLO氧化性强于HCLO4,怎么讲呢? 要配制浓度为0.02mol/L的K2Cr2O7溶液1L,应准确称取K2Cr2O7基准物多少克?(K=39.1,Cr=52.0,O=16)请写出计算过程. 写出下列元素及原子团的化合价 H,K,NA,Ag,O,Ca,Ba,Mg,Zn,Al,OH,SO4,CO3,NO3,NH4,PO4 HClO4和HNO3 反应?方程式有不? 例:如K2Cr2O7标准溶液浓度为0.02150mol/L,问TFe/K2Cr2O7=?g/mL?TFe/K2Cr2O7=0.007192g/mL谁能告诉我怎么解的么. CO3的化合价是多少能不能把此物质的化学名称也写出来? 为什么HClO的氧化性比HClO4强 怎样将0.1000的硫代硫酸钠标准溶液稀释成0.01 mol/L这是书上的解释硫代硫酸钠标准滴定液:c(Na2S2O3)=0.01mol/L。移取1000mL刚标定过的硫代硫酸钠标准溶液0.1000mol/L于100mL棕色容量瓶中,用水稀 氯酸钾化学式 用化学方程式证明KMnO4氧化性比MnO2强 若用a、b、c分别表示有理数a、b、c,0为原点如图所示.已知a 求氯酸钾的化学式 为什么Cr2O7-的氧化性大于SO2能说明 K2Cr2O7能将Na2DO3氧化成Na2SO4? K2Cr2O7中的Cr的化合价怎么求? KClO3如何制取O2 如何证明一个物质的氧化性比另一个的强?如何证明一个物质的氧化性(或还原性)比另一个物质的强?还有在酸性或碱性条件下.(可以举例)还有什么是极性键和非级性键?怎么区分? 重铬酸钾(K2Cr2O7)中铬元素(Cr)的化合价明天就要考试了... 如何做电子密度差分图求答案 k2cr2o7与k2cro4的氧化性谁强? K2Cr2O7 铬元素的化合价是多少 N2H4电子式为什么是这样~看我画的图我知道上面一个图画掉了2个点~ 为什么N最外层只能有8个电子~ 那PCL5 里面P最外层还不是有10个 试比较KMNO4,MNO2,O2氧化性如何进行比较的呢 12个Na2So3恰好与4个K2Cr2O7完全反应,则元素Cr在被还原的产物中的化合价为 (如图)转移电子数问题,C项为什么是转移2mol电子? k2cr2o7加硫酸颜色变 化学方程式配平K2Cr2O7+C+H2SO4→Cr2(SO4)3+K2SO4+CO2+H2OCr从+6→+3,C从0→+4 ,如果按照最小公倍数K2Cr2O7前面是4,C前面是3啊,为什么K2Cr2O7前面是2呢? pcl3的电子式,最好带图
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn