Neo4j 与 Cypher 基础

news2024/10/6 16:24:35

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验

简介


Neo4j 是用 Java 实现的开源 NoSQL 图数据库。从2003年开始开发,2007年正式发布第一版,其源码托管于 GitHub。

与常见的关系型数据库不同,Neo4j 基于图图结构来表示和存储数据,并提供了申明式的查询语言 Cypher 来处理图数据。Neo4j 实现了专业数据库级别的图数据模型的存储,提供了完整的数据库特性,包括 ACID 事务的支持、集群的支持、备份和故障转移等。

Neo4j 作为图数据库中的代表产品,已经在众多的行业项目中进行了应用,如:网络管理、软件分析、组织和项目管理、社交项目等方面。


安装


Docker 部署


这里为了便于练习,我将其使用 Docker 部署到了我滴云服务器上,参考 Docker部署,其他部署方式参考。

首先拉取镜像(可以指定版本):

docker pull neo4j:4.4.5

然后编写一个简单的运行脚本 run.sh

#!/bin/bash

docker run \
        -d \
        --restart=always \
        --name neo4j \
        -p 7474:7474 \
        -p 7687:7687 \
        -v $HOME/docker/neo4j/data:/data \
        neo4j:4.4.5

然后运行脚本部署即可,browser 管理端口为 7474


Browser


Browser 端是 Neo4j 提供的一个图形用户界面(GUI)工具,用于管理和操作 Neo4j 图数据库。

浏览器打开:http://服务器地址:7474 即可访问。

如果没有在启动容器时指定密码,登录的默认密码为 neo4j首次登录后需要重设密码

不出意外的,便能看到如下界面,建议想要快速入门的话直接跟着官方教程走一遍:

image-20230924162531006

Browser 端支持:

  • Cypher 语言支持:允许用户编写和执行 Cypher 语句,支持对数据库中的节点和关系进行查询或编辑操作。
  • 图形可视化:支持节点和关系的可视化布局,能够更直观地体现和反映图数据库中的数据模型和关系。
  • 图形分析:提供了一些图形分析功能,如路径查找、社区检测和聚类分析等。
  • 用户管理:管理 Neo4j 数据库的用户和权限,创建和管理用户账号,分配不同的角色和权限,以控制对数据库的访问和操作。

Cypher-shell


Cypher-shellNeo4j 提供的官方命令行工具,用于执行 Cypher 语言。

使用如下命令进行连接:

cypher-shell -u <用户名> -p <密码> -a <数据库地址>

如果是 Docker 部署,进入容器操作即可:

docker exec -it <容器名> cypher-shell -u <用户名> -p <密码>

退出 Cypher-shell

:exit

Cypher 基础语法


Cypher 是用于图形数据库 Neo4j 的查询语言,它用于在图形数据库中进行数据检索和操作。Cypher 的语法简洁而直观,旨在提供一种易于理解和使用的方式来查询和操作图形数据。

注意

  • CQL 与关系型数据库中的 SQL,一些关键词来源于 SQL,比如:CREATEWHERERETURN 等。
  • CQL 关键字大小写不敏感,也使用 ; 分割多条查询语句。

数据结构


在学习 Cypher 语法前,首先需要了解 Neo4j 数据库的数据结构。

如果你在 Browser 端尝试运行了 Try Neo4j with live data 教程中的第一段代码,你会看到如下界面:

image-20230924163019460

如图所示,Neo4j 中采用节点、属性、关系、标签来存储数据,即右半部分出现的图谱。

  • 节点:
    • 节点是图数据模型的基本单元,用于存储实体数据。
    • 例如,在上图中,演员、电影都是节点,其中每个节点都有对应的属性。
    • 可以将一个节点理解为关系型数据库表中的一条数据,其字段对应节点的属性。
  • 关系:
    • 关系用于表示节点之间的连接或关联,具有一个类型(Type),用于描述节点之间的关系。
    • 关系有且只有一个类型,且必须声明其开始节点和结束节点以及指向。
    • 关系可以自我循环引用,但是两头永远不能为空。
  • 属性:
    • 节点和关系都可以有属性,它是由键值对组成的。
    • 属性可以是基本数据类型(例如字符串、整数、浮点数等)或复杂数据类型(例如数组、日期等)。
    • 节点的属性可以理解为关系型数据库中的字段。关系中的属性进一步的明确了关系。
  • 标签:
    • 标签是对节点的分类,这样使得构建 Neo4j 数据模型更加简单。
    • 在上面的电影案例中,MoviePerson 就是标签。

数据库操作


创建数据库:

CREATE DATABASE name;

删除数据库:

DROP DATABASE name;

修改数据库:

ALTER DATABASE name;

Neo4j 社区版不支持创建、删除和修改数据库,即上面的三个命令社区版用不鸟🤡,只能使用默认的 neo4jsystem 数据库。

查看所有数据库:

SHOW DATABASES;

打开数据库:

START DATABASE name;

关闭数据库:

STOP DATABASE name;

社区版只能同时运行一个数据库实例,如果存在正在运行的实例则启动失败🤡,想同时管理多个还是用企业版吧(


CREATE


创建节点


使用 CREATE 命令来创建节点:

CREATE (n); // 创建一个节点,没有任何标签和属性

创建一个标签为 DOG 的节点:

CREATE (n:DOG);

支持存在多个标签:

CREATE (n:ANIMAL:DOG);

添加属性:

CREATE (n:DOG {name: "LYS", age: 14});

创建多个节点:

CREATE (n:DOG {name: "LYS", age: 14}), (m:CAT {name: "Hiiro", age: 17});

nm 只是节点的变量名,在同一条创建语句中节点的变量名不能相同,节点的变量名不会影响后续的查询。

当然也可以不加变量名:

CREATE (:DOG {name: "LYS", age: 14}), (:CAT {name: "Hiiro", age: 17});

创建关系


创建两个节点的同时创建关系:

CREATE (n:DOG {name: "LYS", age: "14"}) -[r:IN_FAN]-> (m:CAT {name: "Hiiro", age: "17"});

也可以反向创建关系:

CREATE (n:DOG {name: "LYS", age: "14"}) <-[r:out_FAN]- (m:CAT {name: "Hiiro", age: "17"});

关系也可以设置属性:

CREATE (n:DOG {name: "LYS", age: "14"}) -[r:IN_FAN {action: "watch live any time"}]-> (m:CAT {name: "Hiiro", age: "17"});

可以一次性直接创建一条路径:

CREATE (n:DOG {name: "LYS"}) -[:IN_FAN] -> (i:CAT {name: "Hiiro"}) -[:WORK_FOR]-> (m:MOUSE {name: "ChenRay"});

注意:在 Cypher 中,节点之间的关系在创建后不能修改,想要修改只能删除原有关系再重新创建新的关系。


RETURN


RETURN 语句可以返回 Cypher 的执行结果。

比如,我们创建完节点后直接返回:

CREATE (n:DOG {name: "LYS", age: "14"}) RETURN n;

也可以返回我们创建好的关系:

CREATE (n:DOG {name: "LYS", age: "14"}) -[:IN_FAN]-> (m:CAT {name: "Hiiro", age: "17"}) RETURN n, m;

也可以给返回的结果取别名:

CREATE (n:DOG {name: "LYS", age: "14"})
RETURN n.name AS LYS_NAME;

更多关于 RETURN 的用法将在下文陆续提到。


MATCH


首先我们导入一些数据用于后面的示例:

MATCH(n) DETACH DELETE n;
CREATE(n:DOG {name: "LYS", age: 14}) -[:LOVER]-> (:BIRD {name: "Astesia", age: 13}) -[:FRIEND]-> (m:CAT {name: "Hiiro", age: 17}), (n) -[:FAN_OF]-> (m), (c:MOUSE {name: "ChenRay", age: 114}) -[:LOVER]-> (:DOG {name: "LexBurner", age: 514}), (c) -[:FAN_OF]-> (m), (n) -[:WORK_FOR]-> (p:PLANTFROM {name: "BILIBILI"}) -[:HAVE]-> (:DOG {name: "UPs", age: 1919}), (p) -[:BELONGS_to]-> (c);
CREATE(:WORKER:DOG {name: "打工人", age: 60}) -[:WORK_FOR]-> (:BOSS:DOG {name: "老板", age: 20}), (:DOG {name: "黑心老板", age: 0}), (:DOG {name: "黑心老板", age: 1}), (:DOG {name: "伤心打工人", age: 520}), (:DOG {name: "快乐打工人", age: 520}) -[:WORK_FOR]-> (:DOG {name: "良心老板", age: 1314});

条件查询


查询所有的节点及其关系:

MATCH(n) 
RETURN n;

根据标签查询节点,例如查询所有标签包含 DOG 的节点::

MATCH(n: DOG)
RETURN n;

我们在上面提到过关系的创建,现在我们可以通过 MATCHCREATE 查询节点并创建关系了:

MATCH(n:CAT) , (m:PLANTFROM)
CREATE (n) -[:WORK_FOR]-> (m)
RETURN n, m;

使用上述语句创建关系时,必须注意查询结果集的大小,若存在多个符合条件的节点,则会对结果集中所有的节点创建对应关系。

查询所有与某节点有关系的节点:

MATCH (n:CAT {name: "Hiiro"})--(m)
RETURN n, m;

根据关系查询,例如查询关系为 WORK_FOR 的节点:

MATCH (n)--(WORK_FOR)
RETURN n;

-- 并没有指定方向,如需指定使用 --><--

MATCH (n)-->(WORK_FOR)
RETURN n;
MATCH (n)<--(WORK_FOR)
RETURN n;

查询两个节点的关系:

MATCH(n:DOG {name:"打工人"}) -[r]-> (m:DOG {name: "老板"})
RETURN type(r);

关系深度查询


六度分隔(Six Degrees of Separation)理论。

1967年,哈佛大学的心理学教授Stanley Milgram(1933~1984)想要描绘一个连结人与社区的人际连系网。做过一次连锁信实验,结果发现了“六度分隔”现象。简单地说:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过六个人你就能够认识任何一个陌生人。”

由于一个节点可能存在多个关系,如果想要查询一条关系路径,未免包含太多的可行路径,因此需要在指定的深度内进行查询,这个查询的过程类似于迭代加深搜索的过程。

在图数据库中进行关系深度查询时,可以使用 * 运算符来指定关系的深度:

MATCH (startNode)-[*<minDepth>..<maxDepth>]-(endNode)
RETURN startNode, endNode;

其中:

  • (startNode)(endNode) 是节点模式,用于指定起始节点和结束节点。
  • [*<minDepth>..<maxDepth>] 是关系模式,用于指定关系的深度范围。<minDepth> 表示最小深度,<maxDepth> 表示最大深度。可以根据需要省略其中一个值,或者两个值都省略。
    • 如果只指定 <minDepth>,则表示最小深度为该值,而没有最大深度限制。
    • 如果只指定 <maxDepth>,则表示最大深度为该值,而没有最小深度限制。
    • 如果同时指定 <minDepth><maxDepth>,则表示深度范围在最小深度和最大深度之间(包括最小深度和最大深度)。

例如,查询从某个节点出发,关系深度为 1 ∼ 2 1 \sim 2 12 的节点:

MATCH (n:CAT {name:"Hiiro"}) -[*1..2]->(m)
RETURN *;

也可以写成:

MATCH (n:CAT {name:"Hiiro"}) -[*..2]->(m)
RETURN *;

查询两个节点之间的所有路径,指定深度最大为 4 4 4

MATCH path = (n:DOG) -[*..4]->(m:MOUSE)
WHERE n.name = "LYS" AND m.name = "ChenRay"
RETURN path;

查询两个节点之间的最短路径,指定深度最大为 6 6 6

MATCH path = shortestPath((n:DOG) -[*..6]->(m:MOUSE))
WHERE n.name = "LYS" AND m.name = "ChenRay"
RETURN path;

分页查询


使用 SKIPLIMIT 子句来指定要跳过的结果数量和要返回的结果数量:

MATCH (nodes)
RETURN nodes
SKIP <skipCount>
LIMIT <pageSize>;

其中:

  • (nodes) 是节点模式或关系模式,用于指定要返回的节点或关系。
  • SKIP <skipCount> 是用于指定要跳过的结果数量的子句。<skipCount> 是要跳过的结果数量。
  • LIMIT <pageSize> 是用于指定要返回的结果数量的子句。<pageSize> 是要返回的结果数量。

通过适当设置 <skipCount><pageSize> 的值,可以实现分页查询。

例如分页查询标签为 DOG 的节点信息,按照年龄从小到大排序,每页 2 2 2 条数据:

获取第 1 1 1 页:

MATCH (n:DOG) 
RETURN n 
ORDER BY n.age ASC
SKIP 0 LIMIT 2;

获取第 2 2 2 页:

MATCH (n:DOG) 
RETURN n
ORDER BY n.age ASC
SKIP 2 LIMIT 2;

SET & REMOVE


使用 SETREMOVE 对节点进行标签、属性的更新。

更新节点的属性和标签,例如将标签为 DOG 且年龄小于 60 60 60 节点的标签更改为 BOSS 且年龄增加 10 10 10

MATCH(n:DOG)
WHERE n.age <= 60
SET n:BOSS
SET n.age = n.age + 10
RETURN n;

添加多个标签:

MATCH(n:DOG)
WHERE n.name = "LYS"
SET n:DOG:JOKER:STUDENT
RETURN n;

添加新的属性:

MATCH(n:DOG)
WHERE n.name = "LYS"
SET n.school = "HAUE"
RETURN n;

一次性添加多个属性:

MATCH(n:DOG)
WHERE n.name = "LYS"
SET n += {status: "Learning", money: 0, emo: "🤡"}
RETURN n;

移除某个属性或标签:

MATCH(n:DOG)
WHERE n.name = "LYS"
REMOVE n.emo, n:JOKER
RETURN n;

移除多个属性或标签:

MATCH(n:DOG)
WHERE n.name = "LYS"
REMOVE n.status, n.money, n:BOSS:STUDENT
RETURN n;

DELETE


删除节点:

MATCH(n)
WHERE n.name = "伤心打工人" OR n.name = "黑心老板"
DELETE n;
MATCH(n)
WHERE n.name = "打工人"
DELETE n;

如果删除的节点具有关系,则无法删除,需要先删除对应关系后才能删除节点:

MATCH(n) -[r:WORK_FOR]-> (m)
WHERE n.name = "打工人"
DELETE r, m;

或者添加 DETACH 强制删除该节点及其对应关系:

MATCH (n:DOG {name: "快乐打工人"}) 
DETACH DELETE n;

删除所有节点及其关系:

MATCH(n)
DETACH DELETE n;

索引


Neo4j 中同样支持索引,创建索引,以提高在大型数据集上对节点和关系进行查找和匹配的速度。

Neo4j 索引的底层实现原理主要依赖于两个核心组件:标签扫描器(Label Scanner)和属性索引(Property Index):

  • 标签扫描器(Label Scanner):
    • 使用标签扫描器来快速定位具有特定标签的节点。
    • 标签扫描器维护了一个映射表,其中的每个条目都包含一个标签和指向具有该标签的节点的指针列表。当执行针对特定标签的查询时,标签扫描器可以快速定位到相关节点的位置。
    • 标签扫描器允许在节点创建和删除时进行高效的更新,以保持索引的实时性。
  • 属性索引(Property Index):
    • 属性索引是基于节点和关系属性的值构建的数据结构,用于快速查找具有特定属性值的节点或关系。
    • 使用 B+ 树作为属性索引的底层数据结构。树中的每个节点都包含多个键值对,其中键是属性的值,值是指向具有该属性值的节点或关系的指针。
    • 在执行带有属性条件的查询时,属性索引可以通过在 B+ 树上进行范围搜索或精确查找来快速定位到满足条件的节点或关系。

此外,Neo4j 还提供了全文索引(Full-Text Index)和空间索引(Spatial Index)等特定类型的索引,用于支持全文搜索和地理空间查询。这些特定类型的索引也有其特定的底层实现,这里不再做深究。


创建索引


对节点属性创建索引:

CREATE INDEX ON :Label(property)

这将在具有特定标签(Label)的节点上创建一个属性(property)的索引。

对关系属性创建索引:

CREATE INDEX ON :RELATIONSHIP_TYPE(property)

这将在具有特定关系类型(RELATIONSHIP_TYPE)的关系上创建一个属性(property)的索引。


索引查询


对节点属性使用索引:

MATCH (n:Label)
WHERE n.property = value
RETURN n

这将使用节点属性的索引来查找具有特定属性值的节点。

对关系属性使用索引:

MATCH ()-[r:RELATIONSHIP_TYPE]-()
WHERE r.property = value
RETURN r

这将使用关系属性的索引来查找具有特定属性值的关系。


删除索引


使用 DROP INDEX 删除索引,例如:

DROP INDEX ON :Label(property)

这将删除特定标签(Label)上的属性(property)索引。


官方文档参考


  • Neo4j 4.4 安装
  • Cypher Manual 4.4

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

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

相关文章

数据结构:堆的简单介绍

目录 堆的介绍:(PriorityQueue) 大根堆:根节点比左右孩子节点大 小根堆:根节点比左右孩子节点小 堆的存储结构: 为什么二叉树在逻辑上用满二叉树结构,而不是普通二叉树呢? 因为如果是普通二叉树会造成资源的浪费​编辑 堆的介绍:(PriorityQueue) 堆又称优先级队列,何为优先…

Redis初步学习

简单了解 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据库&#xff0c;也被称为数据结构服务器。它以键值对的形式存储数据&#xff0c;并提供了丰富的数据结构&#xff0c;如字符串、列表、集合、有序集合、哈希表等。以下是对Redis的详细介绍…

天府蜂巢成都直播产业基地好不好?全成都做直播的头部企业都在这!

随着直播产业的发展&#xff0c;直播内容的不断丰富&#xff0c;数字科技的兴起为直播行业的沿革提供了技术支撑&#xff0c;网络直播成为新的热门赛道&#xff0c;以及拉动经济的新引擎。成都天府蜂巢直播产业基地位于的成都科学城兴隆湖高新技术服务产业园&#xff0c;不仅是…

活动回顾 | 暴雨也无法阻挡的奔赴,2023 Meet TVM · 深圳站完美收官!

2023 Meet TVM 深圳站于 2023 年 9 月 16 日在腾讯大厦成功举办&#xff0c;百余名参与者亲临现场&#xff0c;聆听讲师们的精彩分享。 作者 | xixi 编辑 | 三羊 本文首发于 HyperAI 超神经微信公众平台~ **由 MLC.AI 社区和 HyperAI超神经主办&#xff0c;Openbayes贝式计算…

网关-开放API接口签名验证方案

接口安全问题 请求身份是否合法&#xff1f;请求参数是否被篡改&#xff1f;请求是否唯一&#xff1f; AppId&AppSecret 请求身份 为开发者分配AppId&#xff08;开发者标识&#xff0c;确保唯一&#xff09;和AppSecret&#xff08;用于接口加密&#xff0c;确保不易被…

加强企业内部数据安全:DataSecurity Plus助您一臂之力

随着数字化时代的到来&#xff0c;企业内部数据安全变得比以往任何时候都更加重要。数据是现代企业的生命线&#xff0c;其中包含了机密客户信息、财务数据、知识产权以及其他敏感信息。因此&#xff0c;保护这些数据免受威胁和泄露是每个企业的首要任务之一。为了助力企业实现…

图片在线制作轻松创作高品质图片,根据自己的需求去绘制编辑适合自己的图片

亲爱的朋友们&#xff0c;你是否曾为了获取一张满足自身要求的图片而烦恼&#xff1f;现在&#xff0c;让我们向你揭秘一种高效绘制图片的神技&#xff01;无论你是设计师、创作者还是普通用户&#xff0c;都能通过这种方法轻松实现定制化的需求&#xff0c;让你的创意得以完美…

静态时序分析(STA)学习记录

STA学习记录 setup timing check:hold timing check :multiple path:path type:四种Timing Path:Latch Timing check(Time Borrowing):没事看看文档总是可以学到很多新东西,提炼精华,方便复习 Timing Path; setup timing check: 我(edge)没到你(data)得提前到 Slack =…

SpringCloud 学习(一)简介和环境搭建

1. 简介 1.1 SpringCloud SpringCloud 基于 SpringBoot 提供了一套微服务解决方案&#xff0c;包括服务注册与发现&#xff0c;配置中心&#xff0c;全链路监控&#xff0c;服务网关&#xff0c;负载均衡&#xff0c;熔断器等组件&#xff0c;除了 NetFlix 的开源组件做高度抽…

【BUG】Failed_to_execute_goal_org.springframework

uuid: 606989c0-5b73-11ee-b9af-9fe36aef5f9f title: tags: [Spring Boot, Maven, 插件, 报错, 类文件版本, 兼容, 解决方案 ] categories: [ ] date: 2023-09-25 15:15:59 “ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准…

阿里云服务器怎么使用?网站上线全教程参考

阿里云服务器使用教程包括云服务器购买、云服务器配置选择、云服务器开通端口号、搭建网站所需Web环境、安装网站程序、域名解析到云服务器公网IP地址&#xff0c;最后网站上线全流程&#xff0c;阿小云分享阿里云服务器详细使用教程&#xff1a; 目录 阿里云服务器使用教程 …

【ccf-csp题解】第5次csp认证-第三题-模板生成系统-字符串模拟

题目描述 思路分析 这个是一个简单的字符串模拟题&#xff0c;但蕴藏了一些细节值得挖掘&#xff0c;故写于博客之中进行记录。 第一、关于数据的读入 对于前m行&#xff0c;直接使用getline函数进行读入即可&#xff0c;注意在读取完m和n之后&#xff0c;要写一个getchar&a…

德大黄鱼开捕 年产量20万吨 京东超市多举措保障黄鱼品质

作为“中国大黄鱼之都”&#xff0c;宁德大黄鱼占全国大黄鱼总产值产量均在90%以上。有关方面预计&#xff0c;今年全年宁德大黄鱼产量达20万吨&#xff0c;年增产10%&#xff0c;直接经济产值超百亿元。 宁德大黄鱼开捕活动&#xff0c;由宁德市政府、宁德渔业协会、京东超市…

Mooctest

开发者 测试框架junit 1.字符串不能除 2.a给了c 3. 4. 5.输入是否>0 6.注释

笔试强训Day3

学了一坤时Linux&#xff0c;赶紧来俩道题目放松放松。 T1&#xff1a;在字符串中找出连续最长的数字串 链接&#xff1a;在字符串中找出连续最长的数字串__牛客网 输入一个字符串&#xff0c;返回其最长的数字子串&#xff0c;以及其长度。若有多个最长的数字子串&#xff0c…

CSAPP Attack Lab

CSAPP Attack Lab 历经一个多星期&#xff0c;之前写完第一部分就一直放着了&#xff0c;稍微补充了一下知识&#xff0c;差点让第二部分吓到&#xff0c;没想到做起来还挺简单哈 这次任务是让我们当一个远古时期的萌新黑客&#xff0c;是不是很酷呀 这次上来才发现看不懂让…

Unity之Hololens如何升级MRTK内置shader支持URP

一.前言 什么是Hololens? Hololens是由微软开发的一款混合现实头戴式设备,它将虚拟内容与现实世界相结合,为用户提供了沉浸式的AR体验。Hololens通过内置的传感器和摄像头,能够感知用户的环境,并在用户的视野中显示虚拟对象。这使得用户可以与虚拟内容进行互动,将数字信…

Linux学习第19天:Linux并发与竞争实例: 没有规矩不成方圆

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 先说点题外话&#xff0c;上周参加行业年会&#xff0c;停更了一周。接下来的周五就要开启国庆中秋双节模式&#xff0c;所以有的时候&#xff0c;尤其是工作以后…

代码随想录算法训练营day6| 哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

目录 一、哈希表理论 hash function ​编辑hash collision 常见哈希结构 1&#xff09;set 2&#xff09;map 二、&#xff08;leetcode 242&#xff09;有效的字母异位词 三、&#xff08;leetcode 349&#xff09;两个数组的交集 四、&#xff08;leetcode 202&…

移动应用中的视频直播美颜sdk集成指南

在今天的移动应用生态系统中&#xff0c;视频直播已经成为了与用户互动、分享体验和传播信息的强大工具。与此同时&#xff0c;直播美颜技术也逐渐崭露头角&#xff0c;让直播主和用户在镜头前呈现出最佳状态。本文将为您提供一份详尽的指南&#xff0c;教您如何在移动应用中集…