使用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 最后是图结果

五、总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中科星图——2020年全球30米地表覆盖精细分类产品V1.0(29个地表覆盖类型)

数据名称: 2020年全球30米地表覆盖精细分类产品V1.0 GLC_FCS30 长时序 地表覆盖 动态监测 全球 数据来源: 中国科学院空天信息创新研究院 时空范围: 2015-2020年 空间范围: 全球 数据简介: 地表覆盖分布…

瑞士0.5米高程地形瓦片数据介绍

一、背景 瑞士是位于中欧的一个国家,以其美丽的自然风光、高质量的生活和强大的金融体系而闻名,其位于欧洲中部,四面环山,与德国、法国、意大利、奥地利和列支敦士登等国家接壤。瑞士境内有许多湖泊和阿尔卑斯山脉的一部分。瑞士…

在 Linux 中挂载新硬盘动态使用

目录 一:添加硬盘并且格式化 二:创建逻辑卷 三:挂载卷到目录 在 Linux 中挂载新硬盘并进行格式化的操作可以按照以下步骤进行: 一:添加硬盘并且格式化 查看现有分区状态和服务器安装的硬盘状态: df -…

node版本切换(nvm)

1.https://github.com/coreybutler/nvm-windows/releases 进入下载nvm管理器 点击下载如果访问不到,可以使用我已下载好上传的 2.将下载文件解压到nvm目录中 3.配置nvm的环境变量 在系统变量中添加: NVM_HOME :包管理器的文件目录 NVM_SYML…

Workfine:用「订阅制」破解中小企业数字化转型困局

中小企业是国民经济和社会发展的重要力量,是扩大就业的载体,是改善民生的关键。《“十四五”数字经济发展规划》明确提出大力推进数字产业化转型,实施中小企业数字化赋能专项行动。数字化转型有利于中小企业降低成本、提高效率、加速转型升级…

k8s Sidecar filebeat 收集容器中的trace日志和app日志

目录 一、背景 二、设计 三、具体实现 Filebeat配置 K8S SideCar yaml Logstash配置 一、背景 将容器中服务的trace日志和应用日志收集到KAFKA,需要注意的是 trace 日志和app 日志需要存放在同一个KAFKA两个不同的topic中。分别为APP_TOPIC和TRACE_TOPIC 二、…

Tensorflow2.0笔记 - Tensor的限值clip操作

本笔记主要记录使用maximum/minimum,clip_by_value和clip_by_norm来进行张量值的限值操作。 import tensorflow as tf import numpy as nptf.__version__#maximum/minimumz做上下界的限值 tensor tf.random.shuffle(tf.range(10)) print(tensor)#maximum(x, y, nameNone) #对…

贪吃蛇---C语言---详解

引言 C语言已经学了不短的时间的,这期间已经开始C和Python的学习,想给我的C语言收个尾,想起了小时候见过别人的老人机上的贪吃蛇游戏,自己父母的手机又没有这个游戏,当时成为了我的一大遗憾,这两天发现C语…

【LeetCode】每日一题 2024_1_30 使循环数组所有元素相等的最少秒数(哈希、贪心、扩散)

文章目录 LeetCode?启动!!!题目:使循环数组所有元素相等的最少秒数题目描述代码与解题思路 LeetCode?启动!!! 今天的题目类型差不多是第一次见到,原来题目描述…

【PyCharm教程】PyCharm 安装、卸载和升级包

PyCharm 为特定的 Python 解释器提供了安装、卸载和升级 Python 包的方法。默认情况下,PyCharm 使用 pip 来管理项目包。对于 Conda 环境,您可以使用conda 包管理器。 在 PyCharm 中,您可以在Python 包工具窗口和 Python 解释器Settings/Pre…

化工企业能源在线监测管理系统,能源管理新利器

化工企业在开展化工生产活动时,能源消耗量较大,其节能潜力空间也较大,因此必须控制能耗强度,促进能效水平的稳步提升。化工企业通过能源现状的分析,能够实现能源使用情况的实时反馈与监管,从而达到节能减排…

直播不仅可以带货,还可以远程协作

直播是一种非常直观高效的信息共享模式,目前直播带货比较火,但我也不懂,现就我涉及的领域和实践做一些分享,目前我所做的直接互动分发系统在软硬件全系统闭环下,结合100ms级的低延迟,基本可以让人有深入其境…

全志R128基础组件开发——显示与屏幕驱动②

sys_config 参数说明 LCD 接口参数说明 lcd_driver_name Lcd 屏驱动的名字(字符串),必须与屏驱动的名字对应。 lcd_model_name Lcd 屏模型名字,非必须,可以用于同个屏驱动中进一步区分不同屏。 lcd_if Lcd Inte…

Trinamic推出步进电机低压微型电机驱动芯片

前言 TRINAMIC运动控制有限公司宣布推出全球最小的具有专利技术StealthChop™的单芯片电机驱动器。TMC2300为2相步进电机设置了高达1.2A RMS的标准和1.8V…11V DC的电压范围,它只需最低的功耗,让人根本觉察不到有电机的存在。 从现在开始,您只…

手把手教测试,全网内容最全最深-jmeter-Recording Controller(录制控制器)

5.1.6.14.Recording Controller(录制控制器) 第一步: 第二步:点击启动按钮,生成证书。证书在jmeter的bin目录下。 第三步:设置代理 第四步:抓取https包需要安装证书,在浏览器edge中安装 未完待续。。。 手…

防火墙的基础知识点

目录 1. 防火墙的定义: 2. 防火墙分类: 3. 防火墙的发展进程: 3.1传统防火墙 (包过滤防火墙)---一个严格的规则表: 3.2传统防火墙(应用代理防火墙)---每个应用添加代理 3.3传统防火墙 (状态检测防火墙)---首次检建立会话表…

【MBtiles数据索引和服务发布】GeoServer改造Springboot番外系列二

xyz地图服务访问示例:http://192.168.1.240:8081/gmserver/raster/xyz/firstWP:Imagery-raster/{z}/{x}/{y}.jpg 访问示例如下: mbtiles目录结构 根据z,x,y获取对应mbtiles文件路径的工具方法 说明:重点是使用getMb…

数据结构总结

数据结构总结 数据结构系列的文章从基本数据类型到数据结构,涵盖整型、布尔值、字符串、列表、元组、字典、集合、堆、栈、链表、树和图,以及队列和环等相关内容。 这里再补充一点:树和图都有更高阶的“玩法”,那就是加权——为每…

面对近期行情大起大落的伦敦银需要关注什么?

近期经常有听到投资者抱怨说,伦敦银价格没有明显趋势,很难做。确实,我们从日线图看,金价处于一个比较宽幅的横盘区间当中,近期的行情也是大涨大跌。投资者认为,面对大起大落的行情无从下手。下面我们就来讨…

必读人工智能数据管理的要点!

人工智能数据管理指企业如何管理系统中的数据。它是企业整体AI治理框架的关键组成部分。 在数据治理中,您可能希望包括以下要素: 可用性 数据提供给有需求的人员访问和使用。本文将回答企业中可访问数据人员的问题。 易用性 数据是结构化、已标注且…