使用Antlr4和neo4j決議sql生成資料地圖
雜談1:
之前學習搭建atlas平臺的時候就很好奇他是如何決議sql,然后根據sql生成對應的血緣圖的,在學習spark原始碼的程序中認識了antlr4 這樣一個可以根據自定義語法規則來決議成語法樹的工具
于是我就希望可以參考atlas的決議功能,將復雜的長sql決議出它的資料地圖出來.
雜談2:
那么有人會問了,這樣做的意義在哪里.
如果做過資料開發之類的作業的話,應該會遇到那種情況,
維護了大量的表,但是不知道這些表究竟被誰用了,
因為迭代更新,可能需要改動表結構,但是不知道會影響到哪些表,這種情況比比皆是.
或者是某些表已經啟用了,成了資料孤島了,但是你還一直浪費資源維護它,種種情況,讓我們意識到資料庫表的元資料維護的重要性.
雜談3:
實作這個功能主要是通過用antlr4定義了sql的語法規則,生成對應的介面代碼,讓我們可以遍歷sql的語法樹
然后就算監聽節點,決議sql,然后構建成neo4j能夠識別的語言進行匯入和展示
更多情況下我們省去了麻煩手動維護在execl中,但是資料的準確性以及實時性得不到保證,所以及時進行元資料管理,可以避免發展后期形成資料沼澤.
apache Atlas 1.2.0 搭建以及hive的集成
https://blog.csdn.net/weixin_44445168/article/details/110727429
Antlr4學習筆記
https://blog.csdn.net/weixin_44445168/article/details/111060493
環境準備
antlr4
利用antlr4生成的語法樹,通過它提供的監聽介面,可以監聽到每個節點及其子節點的內容和狀態,以此來決議我們的sql
這里決議的sql選用oracle,oracle對應的plsql.g4檔案在antlr4git中已經提供了
https://github.com/antlr/grammars-v4/tree/master/sql/plsql
我也已經上傳到資源庫了
https://download.csdn.net/download/weixin_44445168/14967225
生成對應的介面檔案后(可以看上面關于antlr4 的博客關于介面檔案如何生成)

關于入口節點我們選用compilation_unit
我們可以測驗一下

這里提供一條測驗sql
select * from tablea a
left join
tableb b on a.id=b.id
left join
tablec c on a.id=c.id
left join
(select id from tabled d left join tablee on e.id =d.id) d1
on d1.id=a.id

可以看到右邊就是我們將sql決議后的語法樹,我們可以先觀察哪些節點是我們需要的,以及哪些節點需要如何處理.
NEO4J
概述
? 圖形資料庫是以圖形結構的形式存盤資料的資料庫, 它以節點,關系和屬性的形式存盤應用程式的資料, 正如RDBMS以表的“行,列”的形式存盤資料,GDBMS以“圖形”的形式存盤資料,
對于NEO4J這里不多做贅述,我也是為了借鑒atlas才拿來用的,所以如果后續感興趣的話在進行進一步的探索圖資料庫
這里提供一份免費的neo4j資源當然你也可以去對應的官網下載
https://download.csdn.net/download/weixin_44445168/14965747
下載neo4j 后免安裝解壓后進入安裝bin目錄,調出cmd,執行
neo4j.bat console

可以看到對應的埠以及起來了,可以通過訪問
http://localhost:7474 進入neo4j的web界面

如果是第一次的話,需要重置一下登錄密碼,
zh:neo4j
mm:neo4j
這里提供一份測驗代碼
public static void main(String[] args) {
//測驗
Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "admin"));
Session session = driver.session();
session.run("CREATE (a:Person {name: {name}, title: {title}})",
parameters("name", "Arthur001", "title", "King001"));
StatementResult result = session.run("MATCH (a:Person) WHERE a.name = {name} " +
"RETURN a.name AS name, a.title AS title",
parameters("name", "Arthur001"));
while (result.hasNext()) {
Record record = result.next();
System.out.println(record.get("title").asString() + " " + record.get("name").asString());
}
session.close();
driver.close();
}

代碼上傳到github上了,有興趣的可以下載玩玩
antlr4 非研發的還是建議不要去探索,我反正比較吃力
https://github.com/lxw2/Antrl4_Plsql
目前簡單的展示,如果你有更好的想法歡迎一起交流

補充:
neo4j 在除錯程序中比較常用的一些陳述句
查詢某個節點的內容
MATCH (n:tables) RETURN n LIMIT 25
洗掉所有的關系
MATCH (n:tables)-[r]-() DELETE n,r
洗掉所有的節點 (如果洗掉的節點中存在帶有關系的,需要先洗掉關系)
MATCH (n:tables) delete n
創建節點標簽并為之創建關聯關系
CREATE (t_02:tables {comment:'table:t_02',status:'live'})
CREATE (t_01:tables {comment:'table:t_01',status:'live'})
create (t_02)-[:join]->(t_01)
對這些陳述句有興趣的可以去以下網站了解,獲取博客,現在已經有很多這種博客提供查閱了
https://www.w3cschool.cn/neo4j/
–僅供個人學習使用參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255169.html
標籤:其他
上一篇:MySQL8安裝及配置教程
