做業(yè)務(wù)網(wǎng)站友鏈交易交易平臺(tái)
目錄
一、neo4j介紹
二、windows安裝啟動(dòng)neo4j
2.1下載neo4j
2.2 解壓文件
2.3 啟動(dòng)neo4j
三、neo4j基礎(chǔ)操作
3.1 創(chuàng)建結(jié)點(diǎn)和關(guān)系
3.2 查詢
3.3 更改
3.4 刪除
四、技術(shù)血緣Demo實(shí)現(xiàn)
4.1 構(gòu)建節(jié)點(diǎn)對(duì)象
4.2 構(gòu)建存儲(chǔ)對(duì)象
4.3 創(chuàng)建有屬性關(guān)聯(lián)關(guān)系
4.4 最后是圖結(jié)果
五、總結(jié)
前言:對(duì)于大公司或大部門(mén),團(tuán)隊(duì)之間相互合作、中間件的共同使用,技術(shù)之間細(xì)節(jié)是不透明的,遇到異常問(wèn)題時(shí),定位排查困難;如何清晰管理技術(shù)團(tuán)隊(duì)、中間件、數(shù)據(jù)之間的血緣關(guān)系,這成為技術(shù)、產(chǎn)品、數(shù)據(jù)開(kāi)發(fā)等人員的一個(gè)需求。
一、neo4j介紹
? ? ? ?Neo4j 是一種開(kāi)源的圖數(shù)據(jù)庫(kù)管理系統(tǒng),專(zhuān)注于存儲(chǔ)和處理圖結(jié)構(gòu)數(shù)據(jù)。圖數(shù)據(jù)庫(kù)是一種專(zhuān)為處理圖形和網(wǎng)絡(luò)結(jié)構(gòu)而設(shè)計(jì)的數(shù)據(jù)庫(kù),其中的數(shù)據(jù)以節(jié)點(diǎn)和邊(或稱關(guān)系)的形式組成。Neo4j 提供了一種直觀而高效的方式來(lái)表示和查詢復(fù)雜的關(guān)系數(shù)據(jù),使得它特別適用于需要處理強(qiáng)關(guān)聯(lián)和復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu)的場(chǎng)景。
以下是 Neo4j 的主要特點(diǎn)和功能:
- 圖數(shù)據(jù)庫(kù)模型: Neo4j 使用圖數(shù)據(jù)庫(kù)模型,其中的數(shù)據(jù)被組織成節(jié)點(diǎn)和關(guān)系的網(wǎng)絡(luò)。節(jié)點(diǎn)表示實(shí)體,關(guān)系表示實(shí)體之間的關(guān)聯(lián),而節(jié)點(diǎn)和關(guān)系都可以包含屬性。
- Cypher 查詢語(yǔ)言: Neo4j 使用 Cypher 查詢語(yǔ)言,這是一種專(zhuān)門(mén)用于圖數(shù)據(jù)庫(kù)的查詢語(yǔ)言。Cypher 提供了一種直觀且強(qiáng)大的方式來(lái)查詢和修改圖數(shù)據(jù),支持模式匹配、路徑查詢、聚合等操作。
- 性能優(yōu)化: Neo4j 通過(guò)采用類(lèi)似索引結(jié)構(gòu)的存儲(chǔ)引擎,可以快速地執(zhí)行復(fù)雜的圖查詢。它還支持深度優(yōu)先和廣度優(yōu)先的圖遍歷,以及通過(guò)索引快速查找節(jié)點(diǎn)和關(guān)系。
- ACID 事務(wù)支持:Neo4j 提供 ACID(原子性、一致性、隔離性、持久性)事務(wù)支持,確保數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性和可靠性。
- 靈活的數(shù)據(jù)模型: Neo4j 的數(shù)據(jù)模型非常靈活,可以輕松地表示多對(duì)多、多對(duì)一、一對(duì)多等各種關(guān)系。這使得它在處理復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu)和強(qiáng)關(guān)聯(lián)數(shù)據(jù)時(shí)非常強(qiáng)大。
- 支持圖算法: Neo4j 提供了一系列內(nèi)置的圖算法,如最短路徑、廣度優(yōu)先搜索、社交網(wǎng)絡(luò)中的社區(qū)發(fā)現(xiàn)等,幫助用戶進(jìn)行更復(fù)雜的圖分析。
- 可視化工具: Neo4j 提供了直觀的可視化工具,使用戶能夠直觀地查看和理解圖數(shù)據(jù)的結(jié)構(gòu)。這有助于開(kāi)發(fā)人員和分析師更好地理解數(shù)據(jù)和關(guān)系。
- 社區(qū)和生態(tài)系統(tǒng):Neo4j 擁有一個(gè)活躍的開(kāi)源社區(qū),提供了大量的文檔、示例和插件。此外,它還有豐富的生態(tài)系統(tǒng),包括各種工具和驅(qū)動(dòng)程序,與其他數(shù)據(jù)存儲(chǔ)和處理系統(tǒng)集成。
? ? ? ?Neo4j 在許多應(yīng)用領(lǐng)域中得到廣泛應(yīng)用,包括社交網(wǎng)絡(luò)分析、推薦系統(tǒng)、生物信息學(xué)、網(wǎng)絡(luò)安全分析等。其圖數(shù)據(jù)庫(kù)的模型和查詢語(yǔ)言使其成為處理復(fù)雜關(guān)系數(shù)據(jù)的強(qiáng)大工具。
二、windows安裝啟動(dòng)neo4j
2.1下載neo4j
1.從官網(wǎng)下載:https://neo4j.com/download/
2.直接獲取資源包(上手推薦):https://dist.neo4j.org/neo4j-community-3.5.30-windows.zip
2.2 解壓文件
點(diǎn)擊解壓:
2.3 啟動(dòng)neo4j
在neo4j的bin目錄下運(yùn)行:CMD
啟動(dòng)服務(wù):neo4j.bat console
在頁(yè)面登錄鏈接:http://localhost:7474/
默認(rèn)賬號(hào)密碼:一般默認(rèn)的是:用戶:neo4j, 密碼:neo4j;登陸后重新設(shè)置密碼,如:123456
UI頁(yè)面:
三、neo4j基礎(chǔ)操作
有四個(gè)基礎(chǔ)概念:
- 節(jié)點(diǎn)
- 標(biāo)簽
- 屬性
- 關(guān)系
3.1 創(chuàng)建結(jié)點(diǎn)和關(guān)系
創(chuàng)建結(jié)點(diǎn):
3.1.1創(chuàng)建只有一個(gè)標(biāo)簽沒(méi)有屬性的節(jié)點(diǎn):
語(yǔ)法:CREATE (node-name:label-name)
示例:CREATE (m:sdk)
注解:"()"里”:“前第一個(gè)”m“是結(jié)點(diǎn)別名,":"后第二個(gè)"sdk"是結(jié)點(diǎn)標(biāo)簽;別名可以隨意寫(xiě),標(biāo)簽固定。
3.1.2創(chuàng)建一個(gè)有屬性的節(jié)點(diǎn):
語(yǔ)法:CREATE (?node-name:label-name?{ key:Value?})
示例:create (mobile:sdk {name:"name1"})
注解:"{}"里是屬性,以json格式展示。
3.1.3創(chuàng)建多個(gè)標(biāo)簽到節(jié)點(diǎn):
語(yǔ)法:CREATE (node-name:label-name1:label-name2.....:label-namen)
示例:CREATE (m:sdk:usercode {name:"name1"})
注解:以上創(chuàng)建了一個(gè),當(dāng)前別名為m,標(biāo)簽為sdk和usercode,屬性name="name1"的結(jié)點(diǎn);
創(chuàng)建關(guān)系:
3.1.4各兩個(gè)新結(jié)點(diǎn)創(chuàng)建無(wú)屬性關(guān)系
create(m:sdk{type:'SDK'})-[r:write]->(n:api{name:'lxApi'})
return m,r,n
3.1.5給兩個(gè)存在節(jié)點(diǎn)創(chuàng)建有屬性關(guān)系
match(m:sdk{type:'SDK'})
match(n:api{name:'lxApi'})
create(m)-[r:upZip]->(n)
return n,m,r
3.2 查詢
- 從數(shù)據(jù)庫(kù)獲取有關(guān)節(jié)點(diǎn)和屬性的數(shù)據(jù)
- 從數(shù)據(jù)庫(kù)獲取有關(guān)節(jié)點(diǎn),關(guān)系和屬性的數(shù)據(jù)
MATCH檢索,Return返回信息;
通過(guò)標(biāo)簽查詢:
語(yǔ)法:MATCH(node-name:label-name)
示例:示例:MATCH (m:sdk) return m
通過(guò)標(biāo)簽屬性查詢:
語(yǔ)法:MATCH(node-name:label-name{filed:'value1'})
示例:示例:MATCH (n:sdk{name:'name1'}) eturn n
3.3 更改
添加標(biāo)簽:
match (m:sdk{name:'name1'})
SET m:sdk:user
RETURN m;
添加屬性:
match (m:sdk{name:'name1'})
set m.userName='user1'
return m
3.4 刪除
通過(guò)id來(lái)刪除
match(n) where id(n)=86
delete n
通過(guò)屬性來(lái)刪除
match(n:sdk{name:'name1'})
delete n
通過(guò)標(biāo)簽來(lái)刪除
match(n:sdk)
delete n
刪除節(jié)點(diǎn)關(guān)系再刪除節(jié)點(diǎn)
match(n) where id(n)=34
match(m) where id(m)=30
match(n)-[r:write]-(m)
delete r
刪除結(jié)點(diǎn)屬性
MATCH (n:sdk{name:'lxApi'})
remove n.name
return n
刪除結(jié)點(diǎn)標(biāo)簽
match(n:sdk{name:'name1'})
remove n:userName
return n
刪除節(jié)點(diǎn)和節(jié)點(diǎn)關(guān)聯(lián)關(guān)系
MATCH (s:sdk{name:'name1'})
DETACH DELETE s;
刪除所有節(jié)點(diǎn)
MATCH (n)
DETACH DELETE n
刪除所有關(guān)系
start r=relationship(*) delete r;
四、技術(shù)血緣Demo實(shí)現(xiàn)
本次技術(shù)血緣demo涉及三個(gè)團(tuán)隊(duì),三個(gè)中間件,用neo4j圖數(shù)據(jù)庫(kù)構(gòu)建技術(shù)血緣關(guān)系。
通過(guò)SDK采集移動(dòng)端APP的數(shù)據(jù),內(nèi)部API用于管理采集服務(wù),最后依次存儲(chǔ)到HDFS、Kafka、ES。
4.1 構(gòu)建節(jié)點(diǎn)對(duì)象
1.業(yè)務(wù)服務(wù)對(duì)象創(chuàng)建
構(gòu)建采集節(jié)點(diǎn)(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節(jié)點(diǎn): MATCH (e:sdk) RETURN e
2.構(gòu)建采集API管理對(duì)象數(shù)據(jù)節(jié)點(diǎn):
create(n:api:xlp{name:'lxApi',type:'api',message:'離線API,提交zip包,存儲(chǔ)元數(shù)據(jù)到kafka'})
create(n:api:xlp{name:'ssApi',type:'api',message:'實(shí)時(shí)API,上傳實(shí)時(shí)數(shù)據(jù)到kafka'})
2.1構(gòu)建配置索引接口節(jié)點(diǎn)
create(n:api:xlp{name:'configApi',type:'api',message:'配置索引,將消息寫(xiě)入不同索引庫(kù)'})
查詢Api節(jié)點(diǎn):MATCH (n:api) RETURN n
4.2 構(gòu)建存儲(chǔ)對(duì)象節(jié)點(diǎn)
構(gòu)建hdfs存儲(chǔ)對(duì)象:
create(s:hdfs:xlp{name:'hdfs_file',hosts:'ipList',type:'hdfs',message:'移動(dòng)端離線上傳zip包,hdfs存儲(chǔ)地址'})
構(gòu)建Kafka元數(shù)據(jù)存儲(chǔ)Topic:
create(s:kafka:xlp{topic:'id_metadata_info',hosts:'ipList',type:'kafka',message:'移動(dòng)端離線上傳zip包,元數(shù)據(jù)信息'})
構(gòu)建kafka存儲(chǔ)Topic:
create(s:kafka:xlp{topic:'XLP_MOBILE_LOG',hosts:'ipList',type:'kafka',message:'星洲kafka集群Topic,存儲(chǔ)移動(dòng)端解壓數(shù)據(jù)'})
create(s:kafka:xlp{topic:'xlp-log-body',hosts:'ipList',type:'kafka',message:'星洲kafka集群Topic,存儲(chǔ)移動(dòng)端實(shí)時(shí)上傳數(shù)據(jù)'})
create(s:kafka:xlp{topic:'id_m_crash',hosts:'ipList',type:'kafka',message:'星洲kafka集群Topic,存儲(chǔ)移動(dòng)端實(shí)時(shí)上傳崩潰數(shù)據(jù)'})
查詢Kafka存儲(chǔ)節(jié)點(diǎn):MATCH (s:kafka) RETURN s
構(gòu)建ES存儲(chǔ)索引:
create(s:es:xlp{index:'id_m_1000*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存儲(chǔ)移動(dòng)端詳情數(shù)據(jù)'})
create(s:es:xlp{index:'xlp_dev_appid_version_brand_record',hosts:'ipList',type:'es',message:'星洲ES集群索引,存儲(chǔ)app指標(biāo)分析結(jié)果'})
create(s:es:xlp{index:'id_m_user_device_*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存儲(chǔ)用戶分析指標(biāo)結(jié)果'})
create(s:es:xlp{index:'id_m_crash_*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存儲(chǔ)移動(dòng)端崩潰日志'})
create(s:es:xlp{index:'xlp_mobile_message_id_*',hosts:'ipList',type:'es',message:'星洲ES集群索引,存儲(chǔ)移動(dòng)端崩潰message大字段信息'})
create(s:es:xlp{index:'id_network_*',hosts:'ipList',type:'es',message:'移動(dòng)端上傳網(wǎng)絡(luò)詳細(xì)'})
create(s:es:xlp{index:'id_m_1000*',hosts:'ipList',type:'es',message:'移動(dòng)端上傳,用戶登錄時(shí)長(zhǎng)詳情,增加UsedTime字段'})
create(s:es:xlp{index:'id_m_crash*',hosts:'ipList',type:'es',message:'移動(dòng)端上傳,崩潰詳情索引'})
ES存儲(chǔ)對(duì)象:MATCH (e:es) RETURN e
構(gòu)建處理對(duì)象(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,分發(fā)數(shù)據(jù)到不同索引'})
create(f:flink:xlp{name:'UserAnalToEs',type:'flink',message:'讀topic,計(jì)算用戶指標(biāo),結(jié)果存入es'})
create(f:flink:xlp{name:'fDevAnalToEs',type:'flink',message:'讀topic,計(jì)算app指標(biāo)j,結(jié)果存入es'})
create(f:flink:xlp{name:'ssMobileToES',type:'flink',message:'讀實(shí)時(shí)topic,分發(fā)結(jié)果到es'})
查詢Flink任務(wù)節(jié)點(diǎn):MATCH (f:flink) RETURN f
4.3 創(chuàng)建有屬性關(guān)聯(lián)關(guān)系
4.3.1離線上傳對(duì)象關(guān)聯(lián)
match(m:sdk{type:'SDK'})
match(n:api{name:'lxApi'})
create(m)-[r:upZip]->(n)
return n,m,r
4.3.2實(shí)時(shí)上傳數(shù)據(jù)關(guān)聯(lián)
match(m:sdk{type:'SDK'})
match(n:api{name:'ssApi'})
create(m)-[r:toLineData]->(n)
return n,m,r
4.3.3 離線上傳處理關(guān)聯(lián)
記錄元數(shù)據(jù)
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解壓關(guān)聯(lián)
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 存儲(chǔ)kafka關(guān)聯(lián)
match(f:flink{name:'UnZipTask'})
match(k:kafka{topic:'XLP_MOBILE_LOG'})
create(f)-[r:read]->(k)
return k,f,r
4.3.6任務(wù)解析關(guān)聯(lián)
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任務(wù)存儲(chǔ)關(guān)聯(lián)
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 配置索引關(guān)聯(lián)
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 實(shí)時(shí)任務(wù)存儲(chǔ)關(guān)系
match(a:api{name:'ssApi'})
match(t:kafka{topic:'xlp-log-body'})
create(a)-[r:wirte]->(t)
return a,t,r
4.3.10 分發(fā)存儲(chǔ)關(guān)系
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 崩潰日志關(guān)系
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 最后是圖結(jié)果
五、總結(jié)
? ? ? ?技術(shù)血緣建立在數(shù)據(jù)血緣之上,除了可以在節(jié)點(diǎn)構(gòu)建數(shù)據(jù)詳情,映射管理數(shù)據(jù)血緣;還可以將數(shù)據(jù)整個(gè)數(shù)據(jù)生命周期過(guò)程的使用的技術(shù)細(xì)節(jié),管理到血緣關(guān)系中。對(duì)數(shù)據(jù)管理人員、技術(shù)人員和產(chǎn)品經(jīng)理等各方,都可以做到技術(shù)和數(shù)據(jù)的透明管理。