00:00
好,那我们学习完这个new for简单使用以后呢,我们就可以开始来写代码了,也就是说把我们的表级血缘关系呢,呃,给它持久化到这个呃,New for数据库里边,对吧?当然我们new for这个服务呢,其实已经启动了,呃,所以我在这个service里边呢,我给它新建一个呃Java类吧,叫做什么呢?叫做。Table service。对吧,啊,那这个service呢,实际上就是对呃对new forg的操作,对吧,放在这里好,因为这个service一般来说,其实它就是呃,对数据库进行一些增删查改,对吧?呃,那么在这里面的话呢,我们就开始编写这个代码好。然后呢,呃,我们在这儿的话呢,我们首先。呃,我们要做什么呢?呃,当然就是说你可以写放两个比较复杂的,呃,就是说CQ语句对吧,比如说我在这边private。
01:08
Static final,然后呢,String对吧,QS。等于一个什么呢?等于一个new release对吧,然后在这里边,然后呢。CQS对吧,当然就是我我在这的话呢,你你可以把它添加一这个CQs.a对吧,我们可以添加几个比较,呃,就是说复杂CQ语句,比方第一个呢是insert into j mo.table one对吧,然后呢,也就是说插入到table one这个数据库里边,然后select ID name from j.table two。对吧,然后呢,Join。
02:01
J mo.table three,然后再来一个on j mo.table two.id对吧?Table two.id等于j.table three.id对吧?哎,我们这样的话呢,我们就可以呃,添加一个语句来进来了,对吧,添加一个语句进来了啊。呃,当然的话呢,你还可以呃再添加一些更加复杂的这个呃CQL语句,当然这个CQL语句你可以看到,它其实也很简单,就是我把table two和table three的连表查询的结果,呃,给它写入到table one里面,对吧?给它写入到table one里面,好,那我们可以再来添加一个CQ语句CQ s.I的对吧?啊那么这个CQ语句的话呢,其实也是一个简单的插插入语句j more.table two吧,在这个语句里边呢,Table two变成了呃输出表,然后呢,Select ID name from j.table four对吧?呃,也就是说第四张表,然后呢,Draw j mo.table six。
03:23
对吧,然后呢,呃,当然就是说这个你可以先join一个table five,然后再join一个J ma.cable six,对吧,我们表多一点,看一下能不能正确分析,然后on。至冒点table放点ID对吧。呃,等于当然你可以把这个换行来写一下,因为这个可能有点长啊。呃,J mo.table four.id等于j mo.table five。
04:05
第2ID对吧,比如说。然后呢,我们可以甚至可以再来一个and,对吧,And。呃,就是说j Mo点。Table five.id等于j.table six.id对吧?呃,就是我们写了一个非常非常两两行非常非常简单的,呃,这样的,呃,就是说CQ对吧,你可以,当然你这里面不一定是D对吧?你可以是PID对不对,这都是可以的,其实好。OK,那我们现在的话呢,我们就有了两行CQ语句,呃,来作为我们分析血缘关系的测试。然后呢,我们现在我们第一个要做的就是计算对吧,什么最终的血缘关系图中的所有边对吧?我们计算呃,最终的这个血缘关系图中的所有边,所以说在这的话呢,Public static list,也就是说我们返回的呢,是source target,它组成列表,然后generate,好,那这个就是我们产生所有的边,对吧?然后呢,我们在这里边的话呢,我们就是一个y edge set等于new一个。
05:26
啊,哈希set对吧,当然它里边的这个泛型呢,是string啊,那么这个set数据结构用来干嘛呢?用来用来对边进行去虫,因为我们并不想说是把所有的边对吧,就是说呃都给它呃持久化的,你要放这里边,就是你一条边已经存在过的话呢,我们就只需要保留一条边就可以了,所以说我们这需要有一个set数据结构来进行去重,然后呢,第二个的话呢,就是ver edges,那这个就是所有的边对吧,你有一个array,呃,List source target,好啊,那这个实际上就是用来保存返回结果的,然后我们for循环,YCQ,冒号CQS,对吧,我们遍利呃这两条CQ,然后呢,Y list等于。
06:20
Table,对吧,我们调用它静态方法点Li CQ,也就是我们在这儿的话,我们就直接对它进行了一个血缘分析,对吧?每变了一行CQL语句,我们就做血缘关系的分析对吧?做表级血缘关系的分析,好,那分析完以后呢,它返回的是一个呃,Source target。呃,类型的列表对吧,类型的列表,然后呢,For循环。Ver source target,冒号list对吧,我们便利这张表,然后我们做什么呢?我们来看一下if。
07:04
如果。Edge set.contains对吧?也就是说如果它不包含这个source target,点呃,Source,再加上一个箭头对吧?这是拼接出来的一个字符串,然后s target target,如果它不包含这条边的话。那么我们就把这条边呢,给它添加到这个set里边,ADD,对吧,然后source target source,你要注意这个记录它访问字段的方式呢,是呃记录的呃就是说字段名加一个括号对吧?这个是记录的新语法,所以说这的话呢,你要稍微注意一下source target target对吧?我们就把这条边呢,给它添加到几何里边,然后呢,edge.add source target,好,然后添加到结果表里边,然后呢,我们最终返回edges对吧,最终返回edges,那这样的话呢,就呃所有的边呢,我们都计算出来了,而且我们还经过了一个去虫对吧,我们还经过了一个去虫,好,那接下来呢。
08:14
将我们的。将血缘关系图中的所有顶点对吧?当然我们要知道顶点是什么,顶点就是表对吧,表名所有顶点和边对吧?19画到啊这个你for这中。对吧,持久化到new for中。好,呃,也就是说我们在这一步的话呢,我们把血缘关系,整个血缘关系图呢,给它存到呃,New fo这里边,对吧,给它存到new forg里边,呃,当然就是说forg的这个驱动的话呢,我们在P文件里面已经导入了,对吧,我们导入最新版的好,Public static void think to new forg。
09:07
对吧,那么他要把什么给持久化进去呢?当然它的输入参数呢,是source target的列表,然后呢,这个是一个,呃,就是说也就是边的集合,好,我们接下来的话呢,我们首先创建一个集合,用来保存经添已经添加过的顶点,对吧?因为每个顶点在new for这里面,我们我们希望只添加一次,然后呢,Y no等于new一个。哈希set string来保存已经添加过的顶点,然后接下来的话呢,我们。获取什么呢?获取连接new for g的驱动对吧,或者说连接器,然后呢,Y driver等于什么呢?等于gra贝塔贝斯对吧?那这个是new方这里面的一个类,然后点driver,好,那我们的URL是什么呢?我们之前我们都知道说买CQ和c house它的URL呢?呃,都是以JDBC来开头的,对吧?呃,但是new fo呢,它是以BOT来开头的,对吧,博尔特,然后呢,Local hosts的冒号,你要注意这儿它默认是7687。
10:33
好,那这个是我们的,呃,就是说呃,数据库的地址对吧,或者说new for它数据库的一个地址,呃,然后接下来的话呢,我们的用户名和密码是什么呢?OS。然后tokens。对吧,然后basic,好,那在这的话呢,我们的用户名是new for j对吧,然后密码呢,是多少呢?是12345678对吧,八个零好这样的话呢,我们驱动呢,就已经呃给它建好了,然后呢,创建一个和new for g的绘画,对吧?在new for g呢,这叫绘画,实际上在GDBC呢,实际上就是叫连接,对不对,也就是connection,然后我们在这的话挖一个。
11:22
Session等于driver.session对吧?好,我们获取了驱动,然后创建了一个会话或者说连接,当然所以说你在这的话,你就不要忘记把它关闭掉drive.close对吧?把它关闭掉好,OK,我们完成了配对操作,然后接下来的话呢,我们第一我们就开始呃,编写什么呢?编写对new for g的读写好在这的话呢,怎么编写呢?那就是session点它提供的就用这样来使用的execute right without,也就是我们在这里边的话呢,我们执行的是一个写操作,并且不需要返回结果,对吧?它在这的话呢,接受一个拉姆达表达式,拉姆达表达式的参数呢是TX,也就是事物,OK,当然没有任何返回值是吧?首先我们第一步删除你这。
12:22
这中的所有数据对吧?因为我们每次我们都要呃更,每次运行这个程序呢,我们都会更新一次,呃,就是说数据库里边的呃这样的血缘关系,或者说更新一次它的所有数据,好,我们在这边怎么删除呢?对吧?我们之前已经学过如何删除它的语法,我们在这儿就是一个tx.wrong对吧,那它语法是什么呢?Match一个N对吧,然后呢,是deach的delete n对吧。那这样的话呢,我们就把所有的数据都删掉,然后接下来呢,便利血缘关系图中的所有顶点和边,然后添加到new for j数据库中,对吧?因为我们上面这个方法呢,我们已经获取了所有的边,对吧?我们还做了去重,好然后呢,Y for循环YH。
13:26
然后呢,是edges,对吧?我们遍利它每一条边,首先将边的S,也就是圆顶点呢,对吧?顶点添加到new for g,好,那怎么添加呢?我们首先我们每一个顶点只添加一次,所以我们先来完成去虫的判断,如果它不包含这个要添加的原顶点,那么我们才把它添加到呃,New for这里边,首先我们为了做去除,我们先把呃这个edge.s给它添加进来,然后呢,我们执行一个TX wrong,对吧?呃,当然在这的话,我们就要用到一个create语句了。
14:11
Create,然后呢,我们N冒号,它的属性它的类型呢是table对吧?这个N呢是变量名的意思,然后呢,我们的属性是什么呢?我们的属性是我们给它命名一个table name吧,然后冒号对吧?然后加一个单引号,加上什么呢?1h.S对吧?然后再加上一个呃,双引号,单引号外加一个右右画括号。表白加一个画框,然后呢,当然你除了这个以外呢,你还需要再加一个,呃什么呢,我们还需要呃,再加一个这个。就是说右圆括号对吧,那这样的语法才算是正确的哈,然后呢,我们接下来的话呢,照猫画虎将边的target顶点添加到纽for j对吧。
15:07
那你在这的话呢,就是跟上面的代码其实基本上差不多,如果nose点肯如果它不包含这个target,呃,这个顶点,那说明我们就要把它添加到new for这里面,所以说在这的话呢,edge.target然后呢P x.wrong对吧,这个呢是一个create,然后呢N,当然它呢属呃它的类型呢也是table,然后在这的话呢,是table name,然后冒号,然后呢是edge.target然后加上一个。啊,就是说。单引号对吧,然后加上一个画括号,加一个圆括号好就可以了,然后不要忘记加分号是吧?OK,然后呢,我们接下来添加完这两个顶点以后呢。将source target边对吧,当然这个边的话在new方式里面叫做关系对吧,添加到数据库,添加到new包中,也就是我们要在。
16:17
S这个顶点和target这个顶点之间呢,给它来添加一条边对吧?给它来添加一条边好OK,那在这的话呢,我们就是一个TF.run对吧?呃,我们要执行这样的一个字符串,那么这个字符串的话呢,我们怎么来编写呢?对吧?当然首先的话呢,它是一个match,也就是我们首先要把上面的原顶点和目标顶点给它查出来,然后查出来以后呢,再建立一个呃边的关系,对吧?Match回车,我们要查的是什么呢?我们要查的是第一个它的变量名是A,呃,当然它的类型呢是table对吧?呃,第二个我们要查询的呢,是B冒号table,对吧?然后呢,这个A和B它需要满足什么样的关系呢?Y a.cable name等于。
17:12
一个单引号对吧,然后呢,加上一个什么呢?加上一个h.S然后再加上一个单引号对吧?然后再加上一个单引号。啊,那这个呢,我们是设定了A这个顶点,它的条件是要等于h.S啊,当然你还需要设定一下什么呢,设定一下B的这个顶点,对吧。它的属性等于一个,哎,再加上一个什么呢?Edge点啊target对吧,edge.target然后呢,再加上一个圆括,呃,再加上一个单引号对吧,再加一个单引号,然后呢,我们接下来的话呢,我们就可以,呃,就是说创建关系了,对吧,我们接下来就可以创建关系了,好。
18:04
啊,那这个关系怎么创建呢?Create,我们要创建从A到B的一个关系,对吧,对吧,那这个的话你就直接创建了一条边,但是我们还是需要说是呃,就是说给他一个命名的对吧,就是这个边,它的这种关系呢,叫什么名字,所以我们再加一个方括号,那就是R冒号output。对吧,就给它添加了一个对吧,从S到target之这样的一个输出关系,好然后我们使用一个main函数,使用一个main函数的话呢,我们在这里面我们就执行一下think to new for j对吧,Think to new for j,呃,当然我们的这个边来自于哪里呢?来自于这个generate edges edges,好。啊,你要注意我们现在啊,数据库里边图,数据库里边没有任何的数据,我们刚才已经查过了,当然你要是想看的话,你可以再查一遍,没有任何的数据,好我们现在我们运行一下。
19:06
对吧,我们运行一下,看一下它能不能正确的把这个关系给它添加进去,对吧,你可以看到它已经执行完了,然后我们再来执行一次,查询所有顶点和边的这样的一个语句,诶,你会发现它就已经添加进来了,对吧,你可以看到。Table five。Table four和table six呢,把数据对吧,从他们这三张表查询,然后写到了table two里边,然后table two和table three的数据呢,又写到了table one里边,对吧?所以说你可以看到这个血缘关系图呢,它生成的是没有任何问题的,对吧?呃,所以说我们现在的话呢,其实呃已经就是说完成了往new for这里面持久化的这么一个工作,呃,当然在这的话呢,呃,我们只是这样执行程序,对吧,实际上我们还需要做什么事情呢?就是我们需要对接前端对吧,我们需要把这个血缘关系图呢,在前端给它展示出来。
20:07
对吧,你不能说是,呃当然也不是不可以啊,但是总归可能并不是那么优雅对吧,你不能说是让呃产品经理对吧,是你想看血缘关系都可以啊,那你呃自己打开new forg的网页对吧?然后去呃编写这个ser这样的一个查询语言,你自己看去吧,这个可能并不是说特别合适,对吧?呃,所以说我们在这的话呢,呃,我们还是要把它对接到前端对吧?那么这个对接前端的过程,其实就是从new for这里边把顶点和边给它查出来,然后返回给前端,然后在前端呢,使用某些工具呢,给它呃可视化出来,对吧,给它可视化出来好。所以呢,那这个工作呢,就放在哪里呢,它当然就是放在我们的控制器里边,对吧,我们放在我们的控制器里边诶。OK,那这个的话呢,我们在这里我们就再来写一个控制器,用来计算血缘关系的控制器对吧?计算血缘关系的这样的一个控制器,好,那在这儿的话呢,我是一个我的URL的映射呢,是line,然后呢,我们是public string,对吧?我们直接给前端返回一个string,呃,这样的一个类型,当然你也可以把它包装在这个result那个类里面,也是没有任何问题的,对吧?好,首先计算并更新血缘关系对吧?当然你往哪更新呢?往你有for对吧?首先我们是万。
21:40
呃,我们在这里边的话呢,就是table service.think to new forg对吧,然后呢,我们的测试数据呢,是来自于这个generate edges,也就是这些SQL语句的话呢,我直接写死在了类里边,但是你的SQL语句可能来自于。
22:01
数据库里边或者来自于哪里,其实都是可以的,对吧,你你直接把它取出来就行了,好。啊,然后呢,我们在这里边,接下来的话呢,我们就是从你for中查询。所有边和顶点,然后第二步呢,我们要汇成什么呢?呃,就是说因为我们前端的话,你是需要可视化的,所以我们在这的话呢,我们要会。制成mermaid。点JS的字符串,因为我们前端使用的是me JS来可视化这个有效无环图的,呃,当然就说我们为什么选这个呢?其实我这里只是随便选了一个对吧,因为你用eart你也可以实现这个工具,呃,当然我为什么要选这个东西呢?这个是因为ta这个ma编辑器,它其实呃就是说呃在这里边的话呢,它实际上已经内置了这个,呃,Mermaid JS它的一个,呃就是说可视化对吧,它的一个可视化,比方你在这里面。
23:13
呃,Mermaid对吧,然后呢,我在这儿的话,我创建一个这样一个这样的一个图graph lr。对不对,然后两个空格,然后A。箭头B。哎,你就可以看到,它就把这个自动就可视化出来了,对吧,就是我们这个字符串生成这样一个字符串以后呢,你可以直接放到tapoa里边呢,来进行一个测试,对吧?箭头C对吧,AB箭头C对吧,你可以看到,哎,它的可视化效果还是不错的,所以我们直接呢,就从。New for这里边呢,把所有的顶点和以及边的关系呢,给它查出来,对吧,然后给它拼接成一个merma的JS的呃字符串,然后在前端使用me JS呢,直接把它可视化出来,好,所以说在这的话呢,我们首先当然第一步的话呢,还是获取和这个graph获取和new forg的一个呃驱动,呃那么这个驱动的话呢,当然就是BOT冒号双斜杠,Localhost冒号7687。
24:28
然后呢,我们的这个用户名和密码。O tokens.basic对吧?点basic用户名new for j,密码12345678对吧,八个零,OK,那这样的话我们驱动就已经呃,搞定了,然后呢,我们再来一个连接,或者说叫做会话吧,呃,Session,然后呢,driver.session OK,作为配对操作的话呢,不要忘记把它关闭掉对吧?把session和这个驱动呢都给它关闭掉好,然后接下来的话呢,我们在这里边,呃,我们就执行一个,首先我们是一个graph stream。
25:12
等于什么呢?Session点,我们现在执行一个什么呢?我们执行一个read的操作,而这个read的操作呢,它有一个返回值,这个返回值就是我们最终拼接起来的merma的JS所需要的字符串,对吧?当然它接收的还是一个呃,就是说拉姆达表达式,或者说要匿名函数,然后呢,Graph等于。New string builder。对吧,然后呢,我们是一个graph lr对不对,然后斜杠N,我们需要一个换行符,这是它的,呃。Mermaid,它可视化流程图,或者说有效无盘图的时候呢,你必须以graph空格LR来开头,对吧?然后呢,我们现在我们就来查,从new for j中查询所有顶点和边对吧?那么它怎么查询呢?它的查首先我们这个查询结果是result,它的查询方式就是tx.wrong match,我们一个变量名,对吧,第一个顶点是N。
26:24
然后键,然后我们的中横线方括号R,你要注意啊,N是左边的顶点,R是它俩的关系,然后呢,M是右边的顶点对吧,M是右边顶点,当然你这个NRM的话呢,呃,你可以自己去给它定义别的变量名,对吧?可读性更好的也是没有问题的,然后呢,Return n RM好。NR。M好,那这样的话呢,我们就完成了查询,那你完成查询以后呢,这个N是左顶点对吧,N是S顶点,R是target顶点,然后呢,啊不是这个M是它这个顶点啊啊R是关系对吧。
27:21
好,我们把这个都返回,也就是我们查出来所有的以后呢,我们就开始拼接字符串了,For循环,我们怎么拼接呢?For循环record冒号。result.list对吧,这是它查出来的所有顶点和边,然后我们去,呃去就是说对它进行个遍利,然后点判对吧,我们先给它来个缩进,然后呢,A raer。record.get等一下我看一下这个,呃,我们在这的话呢,我们这个代码的话呢,不应该这么来写,对吧?你应该是va record对吧?Record然后呢,record.get我们要get什么呢?当然你要比方你先把N,因为这个N表示S0点嘛,先把它给找出来对吧?找出来以后呢,我们把它的属性名,根据它的属性table name呢,取出它的表名对吧?因为我们这个table name,它这个属性呢,就是表名,然后再来一个apad对吧?那么这个就是箭头,然后再来一个APA。
28:29
点getm。然后点get table name OK。然后不要忘记一个什么呢,不要忘记一个换行符,好,不要忘记一换符,那这样的话,呃,我们的这个graph呢,就已经拼接完成了,对吧,就已经拼接完成了,然后在这我们return,呃一个就是把这个字符串呢,直接给它返回到这个graph string,对吧?Graph string,然后呢,你怎么返回呢?graph.to string,当然我们需要对它做一些ETL,也就是说我在这里边呢,呃,我把所有的双引号都给它去掉对吧,都给它去掉好。
29:15
OK。那这样我们就完成了查询以及拼接字符串的操作,然后我们return graph stream返回给前端就可以了,对吧?返回给前端就可以了。好,我们现在的话呢,就已经完成了血缘关系的编写,对吧,然后我们在这儿的话呢,我们重启一下云台。重启一下这个云台服务,然后我们在前端看它能不能正确的返回,对吧,能不能正确的渲染我们的血缘关系图,好,然后在点击我们的have表血缘关系,对吧,我点击一个血缘关系。你会发现诶,它已经正确的渲染了出来,对吧,正确的渲染了出来,我们看一下这个network,你可以看它返回值是什么,对吧,我们刷新一下这个页面。
30:06
然后呢,我们点击一下这个line对吧,因为我们后端定义的这个请求呢,是government line嘛,然后你可以看到它返回呢,就是一个呃,可以可视化的这样的一个字符串,对吧?然后我前端的使用me JS呢,就把它呃就是说。可视化出来对吧?你可以把这个字符上呢,直接比如说粘到我们的这个tapoa里面,对吧?你粘粘到这儿的话,你会发现,诶这个可视化的结果和我们这儿前端的可视化的结果呢是一样的,当然这种可视化的图的话呢,你不一定要用me对吧,你可以使用呃就是说1AR呀等等等等等,或者说其他的一些流程图的,呃,前端工具都可以把它渲染出来,当然这个就是呃交给前端去做的工呃事情了,对吧?所以到现在为止呢,我们就实现了一个非常迷你,非常简单的一个,呃,就是说中台项目对吧,中台的后端项目,呃,当然大家在这儿呃的话呢,你虽然发现它很迷你,但是它包含了很多很多的东西,对吧?那么其中的每一个模块呢,你都可以对它进行无限扩展,对吧,因为我们之前就说过,呃,企业里的中台项目呢,实际上它的复杂度是很高的,对吧,但是我们这样的一个,呃,而且所以说我们并没有办法说是把企业里面的所有的中台的需求全部。
31:24
不穷尽一遍对吧?你要穷尽一遍的话呢?呃,那么实际上我之前在公司里面做这种管理后台或者说中台的话呢,那么可能光前端的代码就要好几万行JS,对吧?那么后端的代码呢,也是要几万行对吧?那你要这样录成视频的话,可能200个小时都不一定能录得完对吧?呃,但是我们这个虽然迷你的话,但它也基本上说明了问题对吧?它基本上也说明了问题,如果你这样会写的话呢?呃,你至少说对中台它到底是个什么东西你并不陌生的对吧?比方说血缘关系是干嘛的?原数据质量干啥?任务制,任务调度又是怎么实现的对吧?你至少不会对它陌生,呃,那你再去看企业里面的代码的话呢?呃,你也不会一头雾水对吧?你也不会一头雾水,好,那到现在为止的话呢,我们这个中台项目呢,就呃,就讲到这里。
我来说两句