第十八周 直播平台三度关系推荐v1.0-1
项目
1 | 大家好,下面我们开始正式学习直播平台三度关系推荐系统这个项目,这个项目分为1.0和2.0这两个版本。本周我们先学习1.0这个版本。首先我们来看一下项目效果。大家呢,可以在这里面扫码体验。这个就是我们直播平台的首页,当我们点击某一个主播,会进入到主播的详情页,我们在点击这个follow关注按钮的时候。这里面呢,会插入一个模块,它里面显示的是关注了此主播的人,也关注了哪些主播。这就是三度关系推进的效果。这页面上看起来只是把数据展现出来,很简单,但是具体这些数据是怎么来的,如何保证推荐的主播也是用户感兴趣的,这才是我们这个项目的核心内容。下面我们来看一下针对这个项目官方一点的介绍。 |

技术选型之数据采集

1 | 练好。接下来我们先针对这四个模块分析一下他们里面是需要用到的具体的技术框架,俗称技术选型。我们首先来看一下数据采集工具的选择。针对日志数据,目前业内常用的采集工具有下面这些。 |

1 | 然后这个呢,是前端业务机器啊。那如果说我们想采集这个机器上面的一个日志数据的话,最好呢,是部署一个性能消耗低的一个采集工具。因为这上面除此还有其他进程。所以说我们在这里面部署于一个filebeat的性能消耗比较低。还是有那么两台吧。好,那我们在每一台上面都部署一个Bo的,让他呢去采集当前机器里面的人数数据。采集到之后呢,把这个日志数据啊,放到我们的消息队列里面。这个数据进到这个消息页之后呢,后面我们其实就可以使用去对这些数据做一些简单的预处理,预处理之后呢,再把数据写到其他地方。所以接着呢就可以接一个flume,这个时候就不需要去考虑这个性能消耗。这个有可能,它可以直接去读它里面的数据,然后呢,再把数据再写进去,都是有可能的啊。类似于如果从第一个topic上面就是消费数据。把数据拿出来之后呢,对数据做一些处理,处理之后呢,再放到第二个topic都是OK的。以及呢,flume可以直接消费这个消息队列里面这个数据,然后呢,直接把数据呢,写到我们的hdfs分布式文件系统里面也是可以的。 |
1 | 所以在这里我们就需要选择Filebeat和flume了, |
技术选型之数据存储

1 | 前面我们把数据采集工具分析完了,下面我们来分析一下数据存储系统的选择。我们采集到的数据最终会存储到分布式文件系统中,这个分布式文件系统一般就直接选择hadoop中的hdfs,这个就不需要额外的对比啊,因为我们在搭建大数据平台的时候,hdfs已经安装好了。并且它也可以和很多采集工具以及计算框架无缝衔接,所以大数据领域的分布式存储系统一般都直接使用hdfs。目前一些大的厂商也有分布式存储的一些服务,例如亚马逊的s3。我们也可以选择使用这些服务,但是这样的话,针对数据计算就不太友好了。分布式计算框架无法实现本地计算,因为数据和计算节点不在一块儿。所以在这呢,离线数据我们就使用HDFS来求我们的计算框架,计算的结果数据有一些是需要和前端交互的。这些数据呢,前期可以选择存储到MYSQL里。 |

技术选型之数据计算+数据展现
1 | 接下来我们来看一下数据计算框架的选择。目前啊,大数据领域最常用的几种计算框架包括mapreduce、storm、spark、flink。其中mapreduce是第一代计算引擎,它主要针对离线数据进行计算。由于mapreduce计算框架的模型啊是固定的,针对复杂的计算,需要开发多个mapreduce任务,代码量比较多,也比较麻烦,并且它的计算是基于磁盘的,计算效率也比较低,所以现在已经很少使用。 |
项目整体架构

1 | 大家好,前面我们把技术选型搞定了,下面我们来看一下项目的整体架构设计。在这里,我把这个项目分为了三个模块,数据采集、数据计算、存储以及数据展现。因为这个计算以后啊,就涉及到存储了,所以说呢,我把这两个划分到一块儿,那接下来我们来详细分析一下这个项目的整体流程。 |
1 | 那接下来我们来看一下数据计算,还有存储这个模块。计算模块主要呢是利用spark。针对卡夫卡中的数据呢,进行实时计算,针对hdfs中的数据啊,进行离线计算。那在计算的时候呢,它还会和这个noe4j这个图数据库进行交互。既会向里面写数据,也会从里面读数据。最终呢,会把这个spark计算的结果呀,使用sqoop导出到MYSQL里面。针对数据计算这一块,一共有六七种计算指标,具体直接计算指标我们在开发数据计算模块的时候会详细分析。这就是这块的一个流程。 |
1 | 最后一个呢,是这个数据展现。那在这个模块里面,我们可以看到最终的一个项目效果,这里面其实就是一个手机端的一个项目。这个不是我们的重点。这就是我们这个项目的一个整体架构设计。注意,在这个架构里面其实存在三个主要的问题,第一个针对实时计算,Spark其实不是最优的选择,最好是使用flink。针对这个结果,数据的存储mysql也不是最优的选择。最好是使用redis。针对数据展现这一块,直接查mysql中的数据也不是最优的选择。最好是开发接口。对外提供接口查询数据。不过我们为了快速迭代上线,所以前期呢会使用相对来说比较简洁的架构,先把功能快速上线,后面再迭代优化。 |
Neo4j介绍及安装部署
1 | 大家好,针对我们前面分析的这些技术组件,只有filebeat和neo4j我们没有使用过。不过非呢比较简单,它类似于在使用的时候主要是写配置文件,所以在后面用的时候我们再具体分析。下面我们就来学习一下neo4j的使用,让大家快速了解它,并掌握它的常见用。 |

1 | 呃,建议的话不要用这个链接下怎么办。现在呢,还有一个链接。这个。点,建议大家使用这个链接下载。你直接把这个复制到你的那个浏览器里面,打开就可以,它就会自动开始下载。这个现在呢是比较快。sentence。我在这呢已经卸载过了,到时候呢也会把去的安装包发给大家,所以说你想下的话就去下一下,不想下就算了。 |
1 | bin/neo4j stop |
Neo4j之添加数据
1 | 使用neo4j可以很方便的展示一些人物或者事物之间的错综复杂的关系。下面我们来看一张图。 |

1 | 这张图里面展示了这些人物之间的关系。使用这种展示形式看起来是很清晰的。也方便理解,后期如果说我们想查询某一个人的一个关系链,也是很方便的。这些数据如果让你去使用MY数据存储是很繁琐的,并且呢,查询起来也很烦。那这在这里面呢,有几个概念我们需要明确一下。因为neo4j,它是一个图数据库。我们可以认为它里面存储的呢,都是图数据。这个图到底是一个什么东西呢?注意图呢,它是由点边和属性组成的。我们这个图里面这个圆圈呢,它就是一个点。这里面这个线呢,它就是一个边圆圈中的这个姓名呢,就是属性。以及这个边里面这个值呢,也是属性。就是点和边上面都可以设置属性。对,这个点呢,你还可以把它称为是节点。这个边的话,可以把它称为是关系。就类似于这两个人之间的一个关系。每个节点和关系,它都可以有一个或者是多个属性。比如这上面呢,可以保存多属性。 |
添加数据
create
1 | 创建一个点 |
1 | create (p2:Person {name:"ls"}) |
1 | create (p1:Person {name:"zs"}) -[:like]-> (p2:Person {name:"ls"}) |



1 | p1,p2并不会实际存储,用create创建关系,不会检查之前是否存在待创建关系同名的节点 |
1 | 表示每次都创建新的点或者边。第二个表示每次创建点或者编之前呢,会先查询一下,如果存在则不创建。那下面我们就来演示一下。由于在这儿我们需要挑一些密径,所以说呢,在这儿我简单记录一下,这样看起来会更加清晰。a。每次都创建新的点。左边。那我们来在这先创建一个点。嗯。我先把meeting在这写一下,create。注意后面怎么写呢?注意先写一个小括号。英文的啊。冒号后面呢,表示你要创建这个点,你要给它起一个类型,它是什么类型的,表示一个person。还是那些。那你这个person的话,你可以给它设置一些属性,就相当于你在这出现点的时候呢,可以里面给它加些属性,属性怎么加呢?括号括号。我们给它加一个name属性。冒号。后面是这个属性的值,叫张三。那我们在这呢,还可以给它起一个别名P,就类似呢,我们在这创建了一个判对象。判断对象里面有一个内部属性,它的值呢是张三,最终呢,给它起了一个变量的名称叫P。我们来执行一下。放到这里面,点了一个play去执行就可以。添加成功看到没有,创建一个note,创建一个节点,然后设置一个属性。OK,那接下来我们再来创建一个节点。还使用这个。改一下。P2吧。第。把这个拿过来执行一下。那现在的话呢,我们就有两个点了。但是这两个点之间呢,还没有什么关系。那我们想他们两个之间有关系的话,就需要给它们设置一个边了。这个边的话呢,同样可以使用这个create命令来创业。注意,看我怎么实现啊。VISA。对前面的话呢,就类似是这个对吧,把它拿过来。注意,我们想给他设置一个边。就是一个关系。我们想让这个PE啊,这个张三,让他去喜欢李四。表示它们间的关系吗?后面一个横杠中括号冒号,这是固定格式。后面给他写个like,表示呢,张三喜欢李四。一个横杠,一个右键轴。对,这个表示呢,是张三喜欢李四,所以说李四是在后面。对,它这个箭头是往右边指啊,比如他喜欢它,所以呢,在这两个点之间呢,给它设置一个关系叫like。比如张三喜欢的,我们来执行一下。成功了对吧,两个基点。是这两个属性。以及呢,创建了一个关系,或者说呢,是一个边都可以啊。注意,这条命令执行之后,我们可以到这个界面上点这个device。来看一下,你看这是节点,这是关系,这个呢是属性。这是我们创建的person,以及这个like的关系,以及你person里面name的一个属性,在这都可以查看。我们接着可以点那个like。看到没有?张三like李四。这样的话,就可以很清晰的看到他们两个之间的一个关系了。但是呢,这时候呢,你回到这儿来看一下。你看点了一个person。你发现啊,它有四个person。你看两个张三,两个李四。然后你往这个位置看,你看这是内幕李四对吧,所以我们现在啊,选中这个李四和ID,你看是一,那这个呢。李四,它ID是21,看到没有,这个ID是它自动生成的,是唯一的。你看他们两个还不一样,那就意味着这是两个节点,对吧,不是同一个,虽然说他们两个名字一样,但是他们不是同一个极点。那这是什么原因呢?注意,因为这个create呀,它每次呢都会创建新的激烈或者关系。所以说呢,最开始啊,我们使用这个create,你看创建了两个节点,P1还有P2,对这个P1还有P2这个东西它不会扯到就里面。这个以及这个name对应的值是会存储到里面的,这个相当于你给它起了一个别名而已,这个东西不会存进去。那我们之前你看在这创建了一个P1,又创建一个P2,现在我们出现了两个P对象。这是新建的。那接着呢,我们使用这条命令,看到没有。它相当于又创建了两个,这个杠三和离子。所以说呢,你这时候在你的纽扣针里面就有四个。那其实啊,我们在这是想给最开始创建的这两个机制增加一个这个like关系的。因为在实际过程中也会有这种需求,就是节点已经存在了,需要我们后期给他们指定关系。你这种写法,它相当会重新生成。那肯定是不满足我们需求的。这个时候该怎么做呢?咱们前面说了,谬杯里面除了有这个create meaning,它还有一个me meaning。这个命令呢,表示啊,在创建几点之前都会先查询一下,如果存在则不创建。我。这个命令。在创建节点之前都会。先查询一下。如果存在。则不创建。所以说这个默认命令啊,你就算是重复执行,他也不会产生重复的结果。注意你这个奎的命令。你重复执行,你执行一次,他就给你创建一个这个person这个节点。这个需要注意一下啊。那我们看一下me的话,后面的写法是一样的。后面这种写法是一样的。现在我要看起来清晰一些,我给它起个别名叫P3吧。其实都无所谓啊。注意那下面呢,我再写一个,这是P4对吧。这个名字给他改一下吧,这个叫Jack。同时呢,我们想要这个Jack呢,去like to。这样写much。第三。like。kiss。这样写就可以了。现在呢,我先复制这一行,拿过来来执行一下。拖延成功了对吧,创建一个节点,设置一个属性,那你说进行明我再执行一下,你可以直接点那个。再执行一下。看到没有,没有改变。点着来确认一下。看到没有,还是一个,所以说这个默认命令啊,你重复执行,它是不会重新创建的,因为在这的话,它呢,会根据你在这使用的这个名称去查一下,看看有没有重复的,如果有的话,他就不再创建了。所以说呢,在工作中啊,建议使用这个墨。可以避免重复。注意。这条命令你说我单独执行行不行啊不行,你必须要保证这条命令和前面两个一块来执行,因为在这这个变量,我前面说变量它是不会存到u里面的。他呢,只在当前绘画有效,所以说呢,这三条命令需要一块儿来执行。把它们放到一块儿,这样来执行就可以。来确认一下。看到没有,Tom Jack。你点那个也是OK的啊,一样的。这个。like to。对吧,我们记住那个person的话,等于之前我们是四个,现在又加了两个,一共是六个,没有问题。在这里其实还有另外一种写法,如果节点已经存在了,我们只需要创建关系,我们还可以使用那个match来实现。再让我们先简单用一下。那。那么可以查询之前。已有的。节点或者关系。那其实就是电或者是编了嘛。一样的意思啊。那接着呢,我们就想要这个Tom和这个也产生一个like关系。对,你看之前的话呢,是这个。Jack like Tom,那现在的话,我们想让Tom也去like Jack一下,互相习惯,这样的话就不是单相思了嘛,对吧。单相思最难受。所以说我们在这呢这样来做,使用ma先查询那个节点,因为那个节点之前已经创建过了,对吧。可以这样,那我们要给他起个名字叫a吧,还一个person。他的name呢?the Tom。对吧,我们要查两个人啊,要把这个汤还有这个都得查出来,对吧,要找到这两个人,重新再给他们加一个关系。B。name。Jack。把他们两个都查出来,注意,查出来之后注意。a。然后a就是Tom,然后Tom呢去like。B注意这里面这个a还有B,只是为了在这去使用,没有其他含义,你给它起个什么XY也是可以的。来我们来执行一下,注意他们两个也需要一起来执行,要不然那你这个a他是找不到他的。好,执行成功,你看创建了一个关系。这个还是六对吧,没有变。只不过这时候你看没有,汤姆也喜欢Jack克,Jack克也喜欢汤姆,他们两个就互相喜欢了。所以说呢,我们就可以通过match呢,去查询之前已有的机械信息,然后再通过墨创建关系就行。这样也不会额外产生重复的节点。所以说呢,这两种方式啊都可以,你使用这种方式也行,使用这种方式也行。按需选择即可。效果是一样的。 |
merge
1 | 这个命令在创建节点前都会先查询一下,如果存在则不创建 |
1 | merge (p3) -[:like]-> (p4) |


1 | 把上述三条命令一起执行 |
match
1 | 可以查询之前已有的节点(点)或者关系(边) |


1 | 之前jack->tom |
Neo4j之查询数据
1 | 下面我们来看一下用户类中如何查询数据。针对这块我们主要学习以下内容,首先呢,学习一下这个match和return的用法,它们呢可以实现查看满足条件的数据,并且返回。以及最后我们会讲两个案例,如何查询二度关系和三度关系。 |
match+return
1 | match(p:Person {name:"tom"}) return p |
1 | 咱们前面呢说过这个match啊,它可以进行一个查询,下面咱们就来继续使用一下。这个呢,其实有点类似于mysql中的select。在这需要注意一下,match不能单独存在。咱们前面在使用的时候,那后面跟着也是有一个merge命令的。如果我们只想查询一些数据,并且把这个数据返回过去,呃,如何实现呢? |

1 | 那下面呢,我们来查询一些复杂一点的内容。首先呢,在这我们来初始化一些数据。好,这些数据呢,刚才我已经把它复制过来了,就这些数据,注意这里面创建点的这些操作和创建边的操作需要在一个会话里面一起执行啊。否则它是无法识别这些变量的。 |

1 | 在这你看其实相当于我们初始化ABCXYZ是吧,这几个用户。在他们之间呢,给他加了一些关注关系,其实就类似于直播平台里面用户和主播之间的一个关注关系。好在这把这批数据给他做一下初始化,直接复制过来。好创建成功对吧,六个节点六个属性六个关系。那首先呢,现在我们要做一个查询。假设呢,这些都是主播,你看a follow了B对吧,a关注了B,那B的话,我们可以认为它是一个主播对吧?那所以说呢,这样我们要查询某个主播的粉丝信息。我们就查询这哥们儿,你看有这个a和C都关注了他对吧,他的名字呢叫B。B。好,那这时候怎么实现注意。查询嘛,使用。name。我们要查询这个用户,他的一些粉丝。注意看我下面怎么写,相当于啊,是别人关注了他,按照我们之前教的这种写法,就类似于这种,你说把这个拿过来,注意这个箭头是往右指的,也就是说呢,是他操作了别人,他关注了别人。我们现在要查的是谁关注了它,所以说了这个方向不是往右的往左。对吧?我们要查询哪些人关注到这个user b。所以后边的话呢,零。有的。这时候它后面呢,就不需要加这个括,括号里面也不需要指定什么属性了。相当于我们就要查询到底是谁关注了这个user b。这个人具体是谁,我们现在还不知道呢,所以说呢,后面也不需要加一些具体的限定。OK。那个范围就可以。来,我们来执行一下。看到没有a和C。你回过头来看一下。AC对吧,你看。a的话,它这个名字就是大a嘛,对吧,这是大C没问题。所以说呢,我们是可以查出来的。那其实这种写法呀,它还有一种写法。还有一种写法,矢量。mass。把他们反过来。把它放到前面。这个不是注意改一下。对吧。就是谁去follow了这个user。这样写也是可以的。如果说你感觉这种写法比较别扭,你可以用这种写,对吧,谁关着B。这样把它返回过来就可以,效果是一样。11下午啊。如果说我们只想返回满足条件的那个粉丝的一个name值,你看这个相当于它整个把这个几点都给返回来,如果说我们只想返回它里面这个内的属性的值怎么办呢?也简单。值返为零。没问题吧,也是可以的。好,这个其实啊,就是我们要查询的那个主播的二度关系。为什么这样说呢?我们来分析一下啊。你看这个时候呢,是这样的我。这个呢,是这个主播B。后面呢,是主播B的一个粉丝。那这个时候我和这个主播B的粉丝,我们之间是不是就属于一个二度关系呢?因为我和主播B我们之间呢,是一度关系。主币和粉丝之间呢,也是一度关系,但是我和这些粉丝之间就属于二度关系,我们是通过这个主币来认识。好,那我们在这个项目中呢,是想实现三个关系推荐。也就是说呀,当我要关注某个主播的时候,你呢,要给我推荐这个主播的粉丝,又关注了哪些主播,你把那些主播推荐给我。因为我和那些主播之间才属于三种关系。二的关系。三度关系。看到没有,这个时候我和主播N之间就属于三种关系。看到没有,我和他是一组,和它是二度,和它呢也是三组。那这个三的关系该如何查询呢?其实咱们刚才这个呀,查询的就是二楼关系,其实你只需要把这个主播币的粉丝查出来就行了,后期谁去关注主播币,那这个粉丝和那个人,他们之间是不是就是二度关系。 |

1 | 查询某个人的粉丝 |

1 | 查询某个人的粉丝只返回name(属性)值 |
)
1 | 这些属于二度关系(查询我关注的人的粉丝的信息) |
1 | 三度关系(给我推荐我关注的主播的粉丝关注的人) |

1 | 那我们现在想查三度关系,那其实就是查出来主播B的粉丝又关注了哪些主播。只要把这些数据查出来就可以了。我们返回一下。看到没有?这是主播B,有这么几个粉丝啊,A和C看到没有?他有a和C这两个粉丝,分别关注了XYZ这三个主播,其中呢,A和C这两个粉丝呢,都关注了Y这个主播。那这个时候你再给我推荐深度关系的时候呢,就应该从这里面去挑了,那这个时候是不是应该把这个B的粉丝关注比较多的主播推荐给我呢?你看a和C都关注了Y,你是不是应该把它推荐给我呢?在这里,理论上来说,Y这个主播最有可能是我喜欢。这个Z和X呢,它那个可能性啊,就没那么大,所以说呢,在这里面啊,我们在获取这个三度关系的时候呢,针对这个c.name里面这个结果呀,最好呢是做一下过滤。我们统计一下c.name里面相同主播出现的次数。然后呢,按照倒序排序。最终再取一个topN是不是就可以了?重合度越多的说明了越有可能是我喜欢的。因为相当于我去关注这个主播B了,相当于我喜欢主播B。你看a和C这两个粉丝也关注他了,说明他们两个也喜欢他,那有可能我和这个a还有C这两个粉丝这个口味是一样的。那他们两个同时呢,又都关注了Y这个主播,所以说呢,Y这个主播也是最有可能是我喜欢的。所以说呢,这个其实就是三的关系,最终想要达到一个效果。 |
函数
1 | 其实match后面也支持count()、order by、limit等命令 |

1 | 注意:这里count(*)等同于count(cname) |
where
1 | 注意:where放到return之前 |
1 | 其实match后面也支持count()、order by、limit等命令 |

Neo4j之更新数据
1 | 下面呢,我们来看一下如何在应用中去更新数据。更新数据这块啊,其实总结一下有两种情况。第一种呢,就是更新节点的属性,使用match和set实现,你把它先查出来,然后呢使用set命令去修改。第二种啊,就是更新节点之间的关系,也就是边。这个其实就是删除边。我们使用那个ma和D的视线把它查出来,把它删掉。其实呢,你使用这个match和吉delete也可以实现删除节点。对吧,我们把这个节点查出来,然后把它删掉。那下面呢,我们就来演示一下。首先我们看一下就是如何修改节点中的属性。那。有了。name。我使用那个X这个用户吧,行吧。把它查出来之后呢,后面sa.H。等于八,注意如果说它里面没有这个属性,那就把这个属性给加上去,如果有这个属性了,那把这个属性值改成18。看到没有添加一个属性。现在我们可以查一下它。你看a。看到没有,它里面一个name是XH是什么?具有刚才我们给他加了一个属性啊。那接下来我们看一下如何删除关系。match。然后呢?name。a,对,你前面这个变量呢,你能用到了,那你就给它起个变量,如果你用不到,那你就不用起。我们在这呢用不到,所以说就不给它起变量,变成清不洗都无所谓啊。follow。我们看一下之前那个数据这个a。你看它其实呢,关注了BXY对吧,那我们随便找一个吧。name。X吧,对吧,它对它呢也有一个分关系。注意,我们最终啊,想把他们两个之间那个follow关系给它删掉。那怎么办,这时候啊,你要给这个合作关系啊,也起一个别名。起个名称,这样的话在后面呢,使用第一层。这样就可以把它给删掉。看到没有,删除了一个关系。点包。这时候这个a是不是就没有关注那个X了呀。你可以到这儿来查一下。看到没有对吧,X它现在就没有人去follow。就变成一个孤家寡人了,对吧,又没有连到这里面。OK,这就是用户内容针对更新数据的相关操作。如果说你想去删除一条数据啊,就删除一个节点,那你把它查出来对吧,把它查出来后面呢,直接给它就类似这种。前面呢写这个,后面呢加上一个a,就可以把这个name等于X的这个user给它删掉。这个呢,给大家留一个作业,下一周我们自己操作一下行吧,我这个呢就不再演示这个。 |
更新节点属性
1 | match (a:User {name:"X"}) set a.age = 18 |


更新节点之间的关系(边)
1 | match (:User {name:"A"}) -[r:follow]-> (:User {name:"X"}) delete r |


1 | 注意:删除节点 |
Neo4j之建立索引+批量导入数据
1 | 下面我们来看一下neo4j中的索引 |
普通索引
1 | 普通索引 CREATE INDEX ON :User(name) |
唯一索引
1 | 唯一约束 CREATE CONSTRAINT ON (u:User) ASSERT u.id IS UNIQUE |
1 | 那这两种在使用的时候具体该如何选择呢? |
批量导入数据
1 | 那接下来我们将学习一下neo4j如何批量导入数据 |
1 | 例如:merge(a:User {name:“A”}),此时就需要提前对User中的name字段建立索引,否则在进行初始化的时候,数据量大了之后,初始化的性能会很差,因为merge在执行的时候会查询name等于A的数据在不在neo4j中,如果name字段没有建立索引,则会执行全表扫描。 |
1 | 那接着啊,我们先把这个neo4j的数据啊给它清空了,那如何清空数据呢。接着呢,就给大家一种暴力的方式啊。你把它的data目录给删了。因为他的所有数据啊,都放到那个date目录里面。然后呢,重启一下neo4j。stop一下。再启动一下,那接着呢,我们来看一下,我准备了一个测试的一个数据文件。 |

1 | fuid uid |
1 | 这个文件里面一共有两列。fuid是关注者。uid是被关注者。你可以把它认为是主播,这是观众对吧。那我们需要把这个数据啊,给他做一下初始化。那怎么初始化呢,注意。你想要对这个数据做初始化的话,你首先啊,需要把这个文件上传到NEO4J_HOME的import目录下才可以使用。注意你必须要放在这个目录下面才能使用啊,否则neo4j会找不到。这个需要注意一下,那下面呢,我们就把这个批量导入命令啊,先给他写一下。 |
1 | [root@bigdata04 neo4j-community-3.5.21]# bin/cypher-shell -a bolt://bigdata04:7687 -u neo4j -p admin |
1 | 首先针对关键字段建立索引 |
1 | 然后批量导入数据 |
1 | 在neo4j的web界面上也可以执行,需要添加:auto命令。 |

1 | 注意:此时我们会发现在页面中的圆圈中没有显示数据的具体内容,之前我在用3.2版本的时候是没有这个问题的,现在使用新的3.5版本之后会发现页面显示的时候会出现这种问题,这个问题倒没什么影响,就是在页面中看起来不太方便而已。 |
1 | 批量初始化数据 |
1 | bin/cypher-shell -a bolt://bigdata04:7687 -u neo4j -p admin |




1 | 那这个大家有没有感觉到有一些看起来不太一样的地方?咱们前面在创建这个节点的时候,你看节点上面是不是显示的那个内蒙的一个值啊。那你说我现在其实也有一个UID的值啊,你为什么这边没显示出来呢。注意了啊,之前啊,我在用这个纽破利的3.2那个版本的时候呢,是没有这个问题的,那现在呢,使用新的这个3.5这个版本之后啊,发现它这个页面显示的时候呢。会出现这种现象。这种现象啊,倒也没什么影响啊,就说了我们在页面中看起来啊,不太方便而已。那通过我的测试发现呀。我们在添加节点数据的时候呢,如果说你给这个节点啊,指定的一个内部属性,那么内部属性的值默认会显示在这个圆圈里面。如果不是内部的一个字段。就不显示你现在有这个UID字段,不显示这个呢,相当于是这个新版本的一些特性啊。不过这倒不影响啊,只不过说在这看起来啊,有点不太习惯,它这个数据呢,你看它其实存点对吧,UID这个值都是有的啊。好。下面呢,我们来验证一下,我们把UID这个属性的一个名称啊,给它改一下,把它改成name,看看这个值啊,会不会显示到这个圆圈里面。那个只是一个显示形式而已啊,我们来验证一下。验证呢很简单,把这个复制出来一份。对吧,然后在这呢改一下。看了什么?这个测试的。这块呢,这个属性名称改成name。这个也是name对吧。好,这个时候呢,我就在这里面来执行,注意我直接拿过来执行啊,它其实呢会报错。先看一下。看到没有?我搞错了。它下面有个提示。就说啊,你需要加一个什么呀,冒号凹凸。这样才行。所以说呢,也就意味着在它前面啊,加一个冒号。而是自行提交。这就可以了。该成功了,你看这又有了。这样的一个test。看到没有,这样就显示了。是什么?遇到这个问题啊,也不要太感到惊讶,这个只是在新版本上做一些改动,之前那个老版本是没有问题的,就是我们之前线上那个版本是OK的啊。后来呢,给大家在这讲的时候,我们用了一个新的版本,稍微新一点就有一些变化啊。其实两个效果是完全一样的啊,这个只是在这显示而已啊。就是看起来清晰一些,这样可能看起来不太清晰啊,有点B。那这样的话,我们现在就实现了一个批量数据的一个初始化,其实就很简单了,现在呢,我们后期啊,可以把我们想要初始化那些数据啊呃,提前导成这种文件。然后在这写一个这个P,触发一个脚本就OK。所以说呢,那CSV这种方式还是比较方便的,你直接把你需要的数据全部都组装到这一个文件里。 |