赞
踩
目录
前言:对于大公司或大部门,团队之间相互合作、中间件的共同使用,技术之间细节是不透明的,遇到异常问题时,定位排查困难;如何清晰管理技术团队、中间件、数据之间的血缘关系,这成为技术、产品、数据开发等人员的一个需求。
Neo4j 是一种开源的图数据库管理系统,专注于存储和处理图结构数据。图数据库是一种专为处理图形和网络结构而设计的数据库,其中的数据以节点和边(或称关系)的形式组成。Neo4j 提供了一种直观而高效的方式来表示和查询复杂的关系数据,使得它特别适用于需要处理强关联和复杂网络结构的场景。
以下是 Neo4j 的主要特点和功能:
Neo4j 在许多应用领域中得到广泛应用,包括社交网络分析、推荐系统、生物信息学、网络安全分析等。其图数据库的模型和查询语言使其成为处理复杂关系数据的强大工具。
1.从官网下载:https://neo4j.com/download/
2.直接获取资源包(上手推荐):https://dist.neo4j.org/neo4j-community-3.5.30-windows.zip
点击解压:
在neo4j的bin目录下运行:CMD
启动服务:neo4j.bat console
在页面登录链接:http://localhost:7474/
默认账号密码:一般默认的是:用户:neo4j, 密码:neo4j;登陆后重新设置密码,如:123456
UI页面:
有四个基础概念:
创建结点:
3.1.1创建只有一个标签没有属性的节点:
语法:CREATE (node-name:label-name)
示例:CREATE (m:sdk)
注解:"()"里”:“前第一个”m“是结点别名,":"后第二个"sdk"是结点标签;别名可以随意写,标签固定。
3.1.2创建一个有属性的节点:
语法:CREATE ( node-name:label-name { key:Value })
示例:create (mobile:sdk {name:"name1"})
注解:"{}"里是属性,以json格式展示。
3.1.3创建多个标签到节点:
语法:CREATE (node-name:label-name1:label-name2.....:label-namen)
示例:CREATE (m:sdk:usercode {name:"name1"})
注解:以上创建了一个,当前别名为m,标签为sdk和usercode,属性name="name1"的结点;
创建关系:
3.1.4各两个新结点创建无属性关系
create(m:sdk{type:'SDK'})-[r:write]->(n:api{name:'lxApi'})
return m,r,n
3.1.5给两个存在节点创建有属性关系
match(m:sdk{type:'SDK'})
match(n:api{name:'lxApi'})
create(m)-[r:upZip]->(n)
return n,m,r
MATCH检索,Return返回信息;
通过标签查询:
语法:MATCH(node-name:label-name)
示例:示例:MATCH (m:sdk) return m
通过标签属性查询:
语法:MATCH(node-name:label-name{filed:'value1'})
示例:示例:MATCH (n:sdk{name:'name1'}) eturn n
添加标签:
match (m:sdk{name:'name1'})
SET m:sdk:user
RETURN m;
添加属性:
match (m:sdk{name:'name1'})
set m.userName='user1'
return m
通过id来删除
match(n) where id(n)=86
delete n
通过属性来删除
match(n:sdk{name:'name1'})
delete n
通过标签来删除
match(n:sdk)
delete n
删除节点关系再删除节点
match(n) where id(n)=34
match(m) where id(m)=30
match(n)-[r:write]-(m)
delete r
删除结点属性
MATCH (n:sdk{name:'lxApi'})
remove n.name
return n
删除结点标签
match(n:sdk{name:'name1'})
remove n:userName
return n
删除节点和节点关联关系
MATCH (s:sdk{name:'name1'})
DETACH DELETE s;
删除所有节点
MATCH (n)
DETACH DELETE n
删除所有关系
start r=relationship(*) delete r;
本次技术血缘demo涉及三个团队,三个中间件,用neo4j图数据库构建技术血缘关系。
通过SDK采集移动端APP的数据,内部API用于管理采集服务,最后依次存储到HDFS、Kafka、ES。
1.业务服务对象创建
构建采集节点(SDK):
create(m:sdk:mobile{name:'yzSdk',type:'SDK',message:'驿站SDK,app消息采集'} )
create(m:sdk:mobile{name:'jscSdk',type:'SDK',message:'驾驶舱SDK,app消息采集'})
create(m:sdk:mobile{name:'xcSdk',type:'SDK',message:'星辰SDK,app消息采集'})
create(m:sdk:mobile{name:'xzSdk',type:'SDK',message:'行者SDK,app消息采集'})
查询sdk节点: MATCH (e:sdk) RETURN e
2.构建采集API管理对象数据节点:
create(n:api:xlp{name:'lxApi',type:'api',message:'离线API,提交zip包,存储元数据到kafka'})
create(n:api:xlp{name:'ssApi',type:'api',message:'实时API,上传实时数据到kafka'})
2.1构建配置索引接口节点
create(n:api:xlp{name:'configApi',type:'api',message:'配置索引,将消息写入不同索引库'})
查询Api节点:MATCH (n:api) RETURN n
构建hdfs存储对象:
create(s:hdfs:xlp{name:'hdfs_file',hosts:'ipList',type:'hdfs',message:'移动端离线上传zip包,hdfs存储地址'})
构建Kafka元数据存储Topic:
create(s:kafka:xlp{topic:'id_metadata_info',hosts:'ipList',type:'kafka',message:'移动端离线上传zip包,元数据信息'})
构建kafka存储Topic:
create(s:kafka:xlp{topic:'XLP_MOBILE_LOG',hosts:'ipList',type:'kafka',message:'星洲kafka集群Topic,存储移动端解压数据'})
create(s:kafka:xlp{topic:'xlp-log-body',hosts:'ipList',type:'kafka',message:'星洲kafka集群Topic,存储移动端实时上传数据'})
create(s:kafka:xlp{topic:'id_m_crash',hosts:'ipList',type:'kafka',message:'星洲kafka集群Topic,存储移动端实时上传崩溃数据'})
查询Kafka存储节点:MATCH (s:kafka) RETURN s
构建ES存储索引:
create(s:es:xlp{index:'id_m_1000*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存储移动端详情数据'})
create(s:es:xlp{index:'xlp_dev_appid_version_brand_record',hosts:'ipList',type:'es',message:'星洲ES集群索引,存储app指标分析结果'})
create(s:es:xlp{index:'id_m_user_device_*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存储用户分析指标结果'})
create(s:es:xlp{index:'id_m_crash_*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存储移动端崩溃日志'})
create(s:es:xlp{index:'xlp_mobile_message_id_*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存储移动端崩溃message大字段信息'})
create(s:es:xlp{index:'id_network_*',hosts:'ipList',type:'es',message:'移动端上传网络详细'})
create(s:es:xlp{index:'id_m_1000*',hosts:'ipList',type:'es',message:'移动端上传,用户登录时长详情,增加UsedTime字段'})
create(s:es:xlp{index:'id_m_crash*',hosts:'ipList',type:'es',message:'移动端上传,崩溃详情索引'})
ES存储对象:MATCH (e:es) RETURN e
构建处理对象(Flink):
create(f:flink:xlp{name:'UnZipTask',type:'flink',message:'解压zip,读kafka,从HDFS获取zip解压,存入Kafka'})
create(f:flink:xlp{name:'MobileToEs',type:'flink',message:'读kafka,分发数据到不同索引'})
create(f:flink:xlp{name:'UserAnalToEs',type:'flink',message:'读topic,计算用户指标,结果存入es'})
create(f:flink:xlp{name:'fDevAnalToEs',type:'flink',message:'读topic,计算app指标j,结果存入es'})
create(f:flink:xlp{name:'ssMobileToES',type:'flink',message:'读实时topic,分发结果到es'})
查询Flink任务节点:MATCH (f:flink) RETURN f
4.3.1离线上传对象关联
match(m:sdk{type:'SDK'})
match(n:api{name:'lxApi'})
create(m)-[r:upZip]->(n)
return n,m,r
4.3.2实时上传数据关联
match(m:sdk{type:'SDK'})
match(n:api{name:'ssApi'})
create(m)-[r:toLineData]->(n)
return n,m,r
4.3.3 离线上传处理关联
记录元数据
match(n:api{name:'lxApi'})
match(h:kafka{topic:'id_metadata_info'})
create(n)-[r:mark]->(h)
return n,h,r
上传zip包
match(n:api{name:'lxApi'})
match(h:hdfs{name:'hdfs_file_name'})
create(n)-[r:mark]->(h)
return n,h,r
match(k:kafka{topic:'id_metadata_info'})
match(h:hdfs{name:'hdfs_file_name'})
create(k)-[r:relation]->(h)
return k,h,r
match(k:kafka{topic:'id_metadata_info'})
match(h:hdfs{name:'hdfs_file_name'})
create(k)elation]-(h)
return k,h,r
4.3.4 flink解压关联
match(k:kafka{topic:'id_metadata_info'})
match(f:flink{name:'UnZipTask'})
create(k)-[r:read]->(f)
return k,f,r
match(h:hdfs{name:'hdfs_file_name'})
match(f:flink{name:'UnZipTask'})
create(f)-[r:read]->(h)
return h,f,r
4.3.5 存储kafka关联
match(f:flink{name:'UnZipTask'})
match(k:kafka{topic:'XLP_MOBILE_LOG'})
create(f)-[r:read]->(k)
return k,f,r
4.3.6任务解析关联
UserAnalToEs 、fDevAnalToEs
match(k:kafka{topic:'XLP_MOBILE_LOG'})
match(f:flink{name:'UserAnalToEs'})
create(k)-[r:read]->(f)
return k,f,r
match(k:kafka{topic:'XLP_MOBILE_LOG'})
match(f:flink{name:'fDevAnalToEs'})
create(k)-[r:read]->(f)
return k,f,r
match(k:kafka{topic:'XLP_MOBILE_LOG'})
match(f:flink{name:'MobileToEs'})
create(k)-[r:read]->(f)
return k,f,r
4.3.7 ES任务存储关联
match(f:flink{name:'MobileToEs'})
match(e:es{index:'id_m_1000*'})
create(f)-[r:wirte]->(e)
return e,f,r
match(f:flink{name:'UserAnalToEs'})
match(e:es{index:'id_m_user_device_*'})
create(f)-[r:wirte]->(e)
return e,f,r
match(f:flink{name:'fDevAnalToEs'})
match(e:es{index:'xlp_dev_appid_version_brand_record'})
create(f)-[r:wirte]->(e)
return e,f,r
4.3.8 配置索引关联
match(a:api{name:'configApi'})
match(b:api{name:'lxApi'})
create(a)-[r:wirte]->(b)
return a,b,r
match(a:api{name:'configApi'})
match(b:api{name:'ssApi'})
create(a)-[r:wirte]->(b)
return a,b,r
match(a:api{name:'configApi'})
match(b:es{index:'id_m_1000*'})
create(a)-[r:wirte]->(b)
return a,b,r
4.3.9 实时任务存储关系
match(a:api{name:'ssApi'})
match(t:kafka{topic:'xlp-log-body'})
create(a)-[r:wirte]->(t)
return a,t,r
4.3.10 分发存储关系
match(t:kafka{topic:'xlp-log-body'})
match(e:es{index:'id_network_*'})
create(t)-[r:wirte]->(e)
return e,t,r
match(t:kafka{topic:'xlp-log-body'})
match(e:es{index:'id_m_1000*'})
create(t)-[r:wirte]->(e)
return e,t,r
4.3.11 崩溃日志关系
match(a:api{name:'ssApi'})
match(k:kafka{topic:'id_m_crash'})
create(a)-[r:uoData]->(k)
return a,k,r
match(k:kafka{topic:'id_m_crash'})
match(f:flink{name:'ssMobileToES'})
create(k)-[r:uoData]->(f)
return f,k,r
match(f:flink{name:'ssMobileToES'})
match(e:es{index:'id_m_crash*'})
create(f)-[r:wirte]->(e)
return e,f,r
技术血缘建立在数据血缘之上,除了可以在节点构建数据详情,映射管理数据血缘;还可以将数据整个数据生命周期过程的使用的技术细节,管理到血缘关系中。对数据管理人员、技术人员和产品经理等各方,都可以做到技术和数据的透明管理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。