一。图数据库:neo4j操作指南
neo4j 优点:查询高效高可用关系建模直观可视化工具
neo4j 缺点:不适合海量数据,复杂聚合查询慢
能够在大图中实现常数时间的遍历,支持深度和广度的快速查询。
Neo4j是一款原生图数据库,专门用于存储、查询和管理高度关联的数据。
核心特点包括:
1. 图结构存储:以节点(实体)、关系(连接)和属性(键值对)构成数据模型,天然适合表达复杂关联
2. Cypher查询语言:专为图数据设计的声明式查询语言,语法简洁直观
3. ACID事务支持:保证数据操作的原子性、一致性、隔离性和持久性
4. 高性能遍历:针对图遍历操作优化,比传统关系型数据库快数个数量级
核心包括:
节点 (Node):带标签的实体,可包含多个属性
关系 (Relationship):带类型的连接,必须有起点和终点
属性 (Property):以键值对形式存储的数据
标签 (Label):节点的分类标识
路径 (Path):由节点和关系构成的序列
使用的是Cypher查询语言
1.简单操作:
删除数据库 :MATCH (n) DETACH DELETE n
创建数据节点:
创建节点:merger (n:Person {id:'1',name:'李',age:'11'}) return n
merger (n:Person {id:'2',name:'张',age:'11'}) return n
- 创建之间的关系:
MATCH (a:Person {name:'李'}),(b:Person {name:'张'})
merger (a)-[:FRIENDS]->(b)
根据节点(Location)查询
MATCH (a:Person) return a
根据关系查询:
MATCH p=()-[r:FRIENDS]->() return p
MATCH ()-[r:FRIENDS]->() return r
查询关系的关系:
MATCH (a:Person {name:'李'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) return friend_of_a_friend.name AS fofName
增加/修改节点的属性
修改:MATCH (a:Person {name:'李'}) SET a.age='34'
增加:MATCH (a:Person {name:'李'}) SET a.test='test'
删除属性:MATCH (a:Person {name:'李'}) REMOVE a.test
删除节点关联的关系:
MATCH (a:Person {name:'李'})-[r]-()DELETE r
删除节点:MATCH (a:Person {name:'李'}) DELETE a 在操作删除节点的时候先删除关系否则会报错
有关系的节点都删除: MATCH (a:Person {name:'李'})-[r:FRIENDS]-() DELETE a,r
设置唯一标识:merge constraint ON (cc:Table) ASSERT cc.table_id IS UNIQUE
删除关系:MATCH ()-[r:USED_IN]->()DELETE r
2.血缘关系建模与查询
数据模型设计:
Database: 数据库
Table: 数据表
Field: 字段
Task: 处理任务
关系类型:
BELONGS_TO: 归属关系
READ_FROM: 读取关系
GENERATES: 生成关系
创建:
创建数据库节点
merge (sales:Database {name:'db1'})
创建表节点(顶点)
merge (sales:Table {table_id: '1',name:'source', database: 'db1'})
merge (sales:Table {table_id: '2',name:'sink', database: 'db2'})
创建任务节点
merge (a:TaskType {taskid:'1',name: 'task_1',sourceTables:'source',sinkTables:'sink'})
创建字段节点
merger(t:Field{id:'1',name:'id',cname:'标识',type:'int'})
merger(t:Field{id:'2',name:'name',cname:'字段名',type:'String'})
创建表与数据库之间的关系
match(d:Database {name:'db1'}),(t:Table{name:'source'})
merger(d)<-[:BELONGS_TO]-(t)
创建任务与表之间的关系
Task 1: sales_data, customer_data -> order_data
match (sales:Table {table_id: '1'}),(task1:Task {name: 'task_1'}),(s:Table {table_id: '2'})
merger (sales)<-[:READ_FROM {name: '读取'}]-(task1)-[:GENERATES {name: '生成',formulas:'name=oname'}]->(s)
创建表与字段之间的关系
match(f:Field{id:'1'),(t:Table {table_id: '1')
merger(f)-[:BELONGS_TO]->(t)
查询:
查询字段级血缘
match (target_field:Field {name: 'name'})-[:BELONGS_TO]->(b)
RETURN source_field.name AS source_field, b.name AS tablename
查询N度上下游关系
match path=(:Table {name: 'source'})-[*..3]-(:Table)
RETURN nodes(path), relationships(path)
查询特定任务的输入输出
match (task:Task {name: 'ETL_Task_1'})-[r]->(entity)
RETURN entity.name AS related_entity, type(r) AS relationship_type
统计数据表血缘深度
match (t:Table)
WITH t, size((t)<-[:GENERATES*]-(:Table)) AS depth
ORDER BY depth DESC
RETURN t.name, depth
==========================
CALL apoc.load.jdbc(
'jdbc:mysql://localhost/db?user=root&password=root&useUnicode=true&characterEncoding=utf8',
'select * from users_copy'
) YIELD row
MERGE (n:User {uuid: row.uuid}) // 使用MERGE避免重复
ON CREATE SET n.user_id = row.user_id, n.name = row.name
ON MATCH SET n.user_id = row.user_id, n.name = row.name // 可选:更新已有节点
RETURN count(n) AS importedCount;
3.JavaAPI 操作neo4j;
Neo4j的连接参数
public static final String NEO4J_URL = "neo4j://192.168.3.202:37687";
public static final String NEO4J_USER = "neo4j";
public static final String NEO4J_PASSWORD = "bigdata_root";
连接:GraphDatabase.driver(dbUri, AuthTokens.basic(dbUser, dbPassword))
4.spark 操作neo4j
SparkSession.builder
.config("neo4j.url", url)
.config("neo4j.authentication.basic.username", username)
.config("neo4j.authentication.basic.password", password)
.config("neo4j.database", dbname)
.getOrCreate()
// 写入Neo4j
val df = List(
("John", "Doe", 42),
("Jane", "Doe", 40)
).toDF("name", "surname", "age")
df.write
.format("org.neo4j.spark.DataSource")
.mode(SaveMode.Overwrite)
.option("labels", "Person")
.option("node.keys", "name,surname")
.save()
// 从 Neo4j 中读取节点
spark.read
.format("org.neo4j.spark.DataSource")
.option("labels", "Person")
.load()
.show()
spark.read
.format("org.neo4j.spark.DataSource")
.option("labels", ":Person")
.load()
.show()
//
spark.read
.format("org.neo4j.spark.DataSource")//Spark 连接neo4j连接器
.option("relationship", "BOUGHT")//读取的关系
.option("relationship.source.labels", ":Customer")//起始节点
.option("relationship.target.labels", ":Product") //目标节点
.load()
.show()
二. Seatunnel操作指南
Seatunnel(原Waterdrop)是腾讯开源的分布式数据集成平台,支持海量数据的实时/离线同步与处理。
核心特性包括:
1. 多源数据接入(如MySQL、Kafka、HDFS等)
2. 低代码配置化开发,支持SQL和脚本
3. 分布式架构,高吞吐低延迟
4. 内置数据转换、清洗能力
Seatunnel操作指南
//在读取HTTP网页数据get(无传参)的时候怎么写
//在读取HTTP网页数据POST(有传参) 的时候怎么写
执行任务:sh /opt/soft/seatunnel/apache-seatunnel-2.3.5/bin/seatunnel.sh --config aa.conf
三. Trino操作指南
Trino(原名PrestoSQL)是分布式SQL查询引擎,专为交互式分析查询设计。
核心特点:
1. 支持跨多数据源(如Hive、MySQL、Kafka)联邦查询
2. MPP架构,毫秒级响应PB级数据
3. 完全开源,社区活跃
4. 兼容ANSI SQL标准
四。Apache Paimon 是一个高性能的数据湖存储系统,旨在支持批处理和流处理
五。FlinkCDC 是一个
MySQL数据同步
CREATE TABLE if not exists mysql_user (
id STRING,
name STRING,
birth STRING,
gender STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector'= 'mysql-cdc',
'hostname'= '192.168.0.1',
'port'= '3306',
'username'= 'user',
'password'='password',
'server-time-zone'= 'Asia/Shanghai',
'debezium.snapshot.mode'='initial',
'database-name'= 'bigdata1',
'table-name'= 'user'
); 完善文档
最新发布