使用Neo4j做技术血缘管理

目录

一、neo4j介绍

二、windows安装启动neo4j

2.1下载neo4j

2.2 解压文件

2.3 启动neo4j

三、neo4j基础操作

3.1 创建结点和关系

3.2 查询

3.3 更改

3.4 删除

四、技术血缘Demo实现

4.1 构建节点对象

4.2 构建存储对象

4.3 创建有属性关联关系

4.4 最后是图结果

五、总结


前言:对于大公司或大部门,团队之间相互合作、中间件的共同使用,技术之间细节是不透明的,遇到异常问题时,定位排查困难;如何清晰管理技术团队、中间件、数据之间的血缘关系,这成为技术、产品、数据开发等人员的一个需求。

一、neo4j介绍

       Neo4j 是一种开源的图数据库管理系统,专注于存储和处理图结构数据。图数据库是一种专为处理图形和网络结构而设计的数据库,其中的数据以节点和边(或称关系)的形式组成。Neo4j 提供了一种直观而高效的方式来表示和查询复杂的关系数据,使得它特别适用于需要处理强关联和复杂网络结构的场景。

以下是 Neo4j 的主要特点和功能:

  1. 图数据库模型: Neo4j 使用图数据库模型,其中的数据被组织成节点和关系的网络。节点表示实体,关系表示实体之间的关联,而节点和关系都可以包含属性。
  2. Cypher 查询语言: Neo4j 使用 Cypher 查询语言,这是一种专门用于图数据库的查询语言。Cypher 提供了一种直观且强大的方式来查询和修改图数据,支持模式匹配、路径查询、聚合等操作。
  3. 性能优化: Neo4j 通过采用类似索引结构的存储引擎,可以快速地执行复杂的图查询。它还支持深度优先和广度优先的图遍历,以及通过索引快速查找节点和关系。
  4. ACID 事务支持:Neo4j 提供 ACID(原子性、一致性、隔离性、持久性)事务支持,确保数据库的数据一致性和可靠性。
  5. 灵活的数据模型: Neo4j 的数据模型非常灵活,可以轻松地表示多对多、多对一、一对多等各种关系。这使得它在处理复杂网络结构和强关联数据时非常强大。
  6. 支持图算法: Neo4j 提供了一系列内置的图算法,如最短路径、广度优先搜索、社交网络中的社区发现等,帮助用户进行更复杂的图分析。
  7. 可视化工具: Neo4j 提供了直观的可视化工具,使用户能够直观地查看和理解图数据的结构。这有助于开发人员和分析师更好地理解数据和关系。
  8. 社区和生态系统:Neo4j 拥有一个活跃的开源社区,提供了大量的文档、示例和插件。此外,它还有丰富的生态系统,包括各种工具和驱动程序,与其他数据存储和处理系统集成。

       Neo4j 在许多应用领域中得到广泛应用,包括社交网络分析、推荐系统、生物信息学、网络安全分析等。其图数据库的模型和查询语言使其成为处理复杂关系数据的强大工具。

二、windows安装启动neo4j

2.1下载neo4j

1.从官网下载:https://neo4j.com/download/

2.直接获取资源包(上手推荐):https://dist.neo4j.org/neo4j-community-3.5.30-windows.zip

2.2 解压文件

点击解压:

2.3 启动neo4j

在neo4j的bin目录下运行:CMD

启动服务:neo4j.bat console

在页面登录链接:http://localhost:7474/

默认账号密码:一般默认的是:用户:neo4j, 密码:neo4j;登陆后重新设置密码,如:123456

UI页面:

三、neo4j基础操作

有四个基础概念:

  • 节点
  • 标签
  • 属性
  • 关系

3.1 创建结点和关系

创建结点:

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

3.2 查询

  • 从数据库获取有关节点和属性的数据
  • 从数据库获取有关节点,关系和属性的数据

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

3.3 更改

添加标签:

match (m:sdk{name:'name1'})

SET m:sdk:user

RETURN m;

添加属性:

match (m:sdk{name:'name1'})

set m.userName='user1'

return m

3.4 删除

通过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实现

本次技术血缘demo涉及三个团队,三个中间件,用neo4j图数据库构建技术血缘关系。

通过SDK采集移动端APP的数据,内部API用于管理采集服务,最后依次存储到HDFS、Kafka、ES。

4.1 构建节点对象

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

4.2 构建存储对象节点

构建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 创建有属性关联关系

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

4.4 最后是图结果

五、总结

       技术血缘建立在数据血缘之上,除了可以在节点构建数据详情,映射管理数据血缘;还可以将数据整个数据生命周期过程的使用的技术细节,管理到血缘关系中。对数据管理人员、技术人员和产品经理等各方,都可以做到技术和数据的透明管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/360348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity3D日常开发】Unity3D中Text使用超链接并绑定点击事件

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中遇到了要给Text加超链接的需求,研究了实现…

UE4 C++ 枚举类型

先在UCLASS()前写入: //定义枚举变量:方法一 UENUM(BlueprintType) //BlueprintType:在蓝图中可显示、创建该枚举变量 namespace MyEnumType //namespace:命名空间,支持同样的变量命令、便于访问//MyEnumType&#xf…

JAVA和C#怎么开发SECS/GEM:recipe配方处理 S7F1、S7F19

recipe是什么内容呢? recipe是机台加工不同产品时的对应程式,指的是由制造工程师提前在机台上设置,并且EAP控制生产时会自动根据货的类型选择并控制机台按照制造工程师提前设置的方式进行加工。 recipe也称为配方,配方是怎么来的…

idea中yml文件没有提示解决办法

两步解决yml文件不显示提示,yaml文件显示提示问题 1、在插件中心,先下载下图两个插件 2、在Editor》File Types新增文件类型,文件名匹配规则需要将yaml和yml的都加上,加好之后,重启idea,即刻生效。

Meta开源Code Llama 70B,缩小与GPT-4之间的技术鸿沟

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【日常总结】如何快速迁移Navicat中的全部连接设置到新安装的Navicat中?

一、场景 二、需求 三、解决方案 Stage 1:“文件”-->“导出连接”。 Stage 2:获取备份文件 connections.ncx Stage 3:导入connections.ncx 四、不足 一、场景 公司电脑换新,所有软件需要重装,包括navicat 1…

设计模式篇---备忘录模式

文章目录 概念结构实例总结 概念 备忘录模式:在不破坏封装的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,像这样可以在以后将对象恢复到原先保存的状态。 就好比我们下象棋,下完之后发现走错了,想要回退…

Spring Boot 中文件上传

Spring Boot 中文件上传 一、MultipartFile二、单文件上传案例三、多文件上传案例四、Servlet 规范五、Servlet 规范实现文件上传 上传文件大家用的最多的就是 Apache Commons FileUpload,这个库使用非常广泛。Spring Boot3 版本中已经不能使用了。代替它的是 Sprin…

记录 | ubuntu安装terminal并配置

安装 terminal sudo apt update sudo apt install terminator 重新打开终端就是了 配置,右键 -> 配置文件首选项 快捷键 新建窗口:CtrlShiftT关闭窗口:Ctrl_ShiftW水平划分窗口:CtrlShiftO垂直划分窗口:CtrlShi…

excel中去掉单元格中两个数字之间的空格

excel中去掉单元格中两个数字之间的空格 使用公式:SUBSTITUTE(A1," “,”") 解释:将A1单元格中的空格查找出来并去掉。

【React】在项目中使用阿里图标库

文章目录 打开阿里图标库 》 选择相应图标项目 选择Symbol格式,并复制链接 基于antd新建一个JS文件 MyIcon.js,并绑定上面复制的链接 import { createFromIconfontCN } from ant-design/icons;// 图标有更新时,需更新下面图标链接 export…

【数据结构之二叉树的构建和遍历】

数据结构学习笔记---009 数据结构之二叉树1、二叉树的概念和结构1.1、回顾二叉树的重要性质1.2、回顾二叉树的主要分类1.1、如何实现二叉树? 2、二叉树的实现2.1、二叉树的BinaryTree.h2.2、二叉树的BinaryTree.c2.2.1、二叉树的构建2.2.2、二叉树销毁2.2.3、二叉树…

【Time Series】LSTM代码实战

一、简介 还是那句话,"时间序列金融"是一个很有"钱"景的话题,还是想尝试采用Stock时间序列预测任务DeepLearning。本文提供了LSTM预测股票的源代码。 二、算法原理 长短期记忆网络(LSTM)是一种特殊的循环神经…

以“美”为鉴,探寻香港比特币现货ETF的未来发展

出品|欧科云链研究院 作者|Hedy Bi 根据The Block于1月29日的报道,嘉实国际成为了首家向香港证监会提交比特币现货ETF申请的机构。早在去年12月22日,香港证监会发布了《有关证监会认可基金投资虚拟资产的通函》,明确…

突破瓶颈,提升开发效率:Spring框架进阶与最佳实践-IOC

IOC相关内容 1.1 bean基础配置1.1.1 bean基础配置(id与class)1.1.2 bean的name属性步骤1:配置别名步骤2:根据名称容器中获取bean对象步骤3:运行程序 1.1.3 bean作用范围scope配置1.1.3.1 验证IOC容器中对象是否为单例验证思路具体实现 1.1.3.2 配置bean为非单例1.1.…

C++文件操作(1)

C文件操作 1.文本的写入及读取文本文件写入文本文件读取 2.二进制文件的写入及读取二进制文件写入二进制文件读取 3.小结 C也有处理文件的能力,其功能实现依赖文件流。文件流是C中用来处理文件输入输出的一种流类。文件流可以用于从文件中读取数据或将数据写入到文件…

开发工具git分支冲突解决

在团队协作的软件开发过程中,Git是一款广泛使用的版本控制系统。然而,当多个开发者同时修改同一文件或代码段时,就会产生分支冲突。解决这些冲突需要仔细的协调和技术知识。本篇博客将介绍Git分支冲突的解决方法,以及开发工具和最…

四工序开料机可以加工什么产品

四工序开料机是木工机械设备中一款重要设备,该设备主要的功能是开料、打孔、拉槽等,一机多用,凭借多功能的加工效果,实现高速加工的效果,那么这样的设备可以加工什么类型的产品呢?大家对此了解多少呢&#…

idea报错 :(java: 找不到符号)

java: 找不到符号 符号: 变量 adminService 位置: 类 com.example.controller.WebController 查到网上一个办法:因为项目是maven:先点clean在点package

anaconda离线安装包的方法

当设备没有网络时,可以使用有网络的设备先下载所需安装包,然后离线拷贝到需要安装的设备,最后安装。 一. 下载所需安装包 下载命令:使用pip download。详细描述参见pip download -h 以"blind-watermark"为例。 pip …