当前位置: 首页 > news >正文

【Java万花筒】图数据库 vs 多模型数据库:哪种数据库适合你的应用场景?

解密图数据库与多模型数据库:特性、查询语言和成功案例的全景展示

前言

图数据库和多模型数据库在当今数据处理领域扮演着重要的角色。本文将介绍四个主要的图数据库和多模型数据库:Neo4j、Apache TinkerPop、JGraphT和ArangoDB,探索它们的特点、查询语言以及适用的应用场景。

欢迎订阅专栏:Java万花筒

文章目录

  • 解密图数据库与多模型数据库:特性、查询语言和成功案例的全景展示
    • 前言
      • 1. Neo4j(图数据库)
        • 1.1 特点与优势
        • 1.2 数据模型与存储结构
          • 1.2.1 图节点(Node)
          • 1.2.2 图关系(Relationship)
        • 1.3 查询语言与API
          • 1.3.1 Cypher 查询语言
          • 1.3.2 Java API
        • 1.4 应用场景与案例
      • 2. Apache TinkerPop(图处理框架)
        • 2.1 概述与背景
        • 2.2 图处理模型
        • 2.2.1 图遍历(Traversal)
        • 2.3 Gremlin 语言
          • 2.3.1 Gremlin 查询语言
          • 2.3.2 Gremlin 语言特性
        • 2.4 应用场景与案例
      • 3. JGraphT(图理论库)
        • 3.1 库概述
        • 3.2 图模型与数据结构
          • 3.2.1 有向图(Directed Graph)
          • 3.2.2 无向图(Undirected Graph)
        • 3.3 图算法与操作
          • 3.3.1 最短路径算法
          • 3.3.2 最小生成树算法
        • 3.4 图可视化与扩展
          • 3.4.1 图可视化工具
          • 3.4.2 JGraphT 扩展模块
      • 4. ArangoDB(多模型数据库)
        • 4.1 多模型数据库概述
        • 4.2 数据模型与查询语言
          • 4.2.1 文档型数据模型
          • 4.2.2 图型数据模型
          • 4.2.3 键-值型数据模型
        • 4.3 多模型数据操作与API
          • 4.3.1 AQL 查询语言
          • 4.3.2 Java API
        • 4.4 应用场景与案例
    • 总结

1. Neo4j(图数据库)

1.1 特点与优势

Neo4j是一种流行的图数据库,具有以下特点和优势:

  • 高性能:Neo4j通过使用原生图存储和查询模型,实现了高效的图操作和查询。
  • 灵活的数据模型:Neo4j的数据模型是基于节点和关系的图结构,可以轻松表示复杂的关系和连接。
  • 高度可扩展:Neo4j支持水平扩展,可以处理大规模的图数据。
  • 冗余数据消除:Neo4j使用索引和数据压缩技术来减少冗余数据,提高存储效率。
  • ACID事务支持:Neo4j支持ACID(原子性、一致性、隔离性和持久性)事务,确保数据一致性和完整性。
1.2 数据模型与存储结构

Neo4j的数据模型是基于节点和关系的图结构。

1.2.1 图节点(Node)

图节点是数据的基本单元,可以存储属性和标签。节点通过唯一的标识符(ID)进行引用,可以通过属性进行查询。

import org.neo4j.driver.*;
import static org.neo4j.driver.Values.parameters;public class Neo4jNodeExample {public static void main(String[] args) {try (Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password"))) {try (Session session = driver.session()) {session.run("CREATE (n:Person {name: $name, age: $age})", parameters("name", "John", "age", 30));session.run("CREATE (n:Person {name: $name, age: $age})", parameters("name", "Alice", "age", 25));}}}
}
1.2.2 图关系(Relationship)

图关系用于表示节点之间的连接和关系。关系具有类型、方向和属性,并且可以具有唯一的标识符。关系可以通过节点和属性进行查询。

import org.neo4j.driver.*;
import static org.neo4j.driver.Values.parameters;public class Neo4jRelationshipExample {public static void main(String[] args) {try (Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password"))) {try (Session session = driver.session()) {session.run("MATCH (a:Person), (b:Person) WHERE a.name = $name1 AND b.name = $name2 " +"CREATE (a)-[r:KNOWS {since: $year}]->(b)", parameters("name1", "John", "name2", "Alice", "year", 2020));}}}
}
1.3 查询语言与API

Neo4j提供了Cypher查询语言和Java API来进行图数据库的查询和操作。

1.3.1 Cypher 查询语言

Cypher是Neo4j的查询语言,用于在图数据库中执行查询和操作。

import org.neo4j.driver.*;
import static org.neo4j.driver.Values.parameters;public class Neo4jCypherExample {public static void main(String[] args) {try (Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password"))) {try (Session session = driver.session()) {StatementResult result = session.run("MATCH (n:Person) WHERE n.age > $age RETURN n.name", parameters("age", 25));while (result.hasNext()) {Record record = result.next();System.out.println(record.get("n.name").asString());}}}}
}
1.3.2 Java API

Neo4j还提供了完整的Java API,使开发人员可以使用Java编程语言访问和操纵图数据库。

import org.neo4j.driver.*;
import static org.neo4j.driver.Values.parameters;public class Neo4jJavaAPIExample {public static void main(String[] args) {try (Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password"))) {try (Session session = driver.session()) {Transaction transaction = session.beginTransaction();transaction.run("CREATE (n:Person {name: $name, age: $age})", parameters("name", "John", "age", 30));transaction.run("CREATE (n:Person {name: $name, age: $age})", parameters("name", "Alice", "age", 25));transaction.commit();}}}
}
1.4 应用场景与案例

Neo4j广泛应用于各种领域的图数据管理,例如:

  • 社交网络分析:通过表示用户、朋友关系和兴趣等关系,进行社交网络分析和推荐系统。
  • 知识图谱:构建和查询关于实体和关系的图谱,用于语义搜索和知识图谱的构建。
  • 身份和访问管理:使用图数据库来处理和查询用户、组织和权限之间的关系,实现高效的身份和访问管理系统。

2. Apache TinkerPop(图处理框架)

2.1 概述与背景

Apache TinkerPop是一个开源的图计算框架,旨在统一不同图数据库的查询和操作接口。它提供了一种通用的图处理模型和查询语言,称为Gremlin。

2.2 图处理模型

TinkerPop的图处理模型基于图遍历,可以通过一系列步骤来遍历和查询图中的节点和关系。遍历可以定义复杂的图查询逻辑。

2.2.1 图遍历(Traversal)

图遍历是指从图中的一个或多个起始节点出发,按照一定的规则遍历图中的节点和关系。TinkerPop使用Gremlin遍历语言来定义图遍历。

import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;public class TinkerPopTraversalExample {public static void main(String[] args) {TinkerGraph graph = TinkerGraph.open();GraphTraversalSource g = graph.traversal();g.addV("person").property("name", "John").property("age", 30).next();g.addV("person").property("name", "Alice").property("age", 25).next();GraphTraversal<Vertex, String> traversal = g.V().has("age", P.gt(25)).values("name");while (traversal.hasNext()) {System.out.println(traversal.next());}}
}
2.3 Gremlin 语言
2.3.1 Gremlin 查询语言

Gremlin是TinkerPop的查询语言,用于在不同的图数据库上执行通用的图查询操作。它具有类似SQL的语法,支持复杂的图查询和数据操作。

2.3.2 Gremlin 语言特性

Gremlin具有许多强大的特性,例如条件过滤、遍历步骤、聚合操作和图形操作。它还提供了丰富的内置函数和操作符来处理图数据。

import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;public class GremlinLanguageExample {public static void main(String[] args) {Graph graph = TinkerGraph.open();Vertex john = graph.addVertex(T.label, "person", "name", "John", "age", 30).next();Vertex alice = graph.addVertex(T.label, "person", "name", "Alice", "age", 25).next();graph.traversal().V().has("age", P.gt(25)).values("name").forEachRemaining(System.out::println);}
}
2.4 应用场景与案例

Apache TinkerPop广泛应用于以下领域:

  • 图分析和挖掘:使用TinkerPop进行复杂的图分析和挖掘任务,如社区检测、路径分析和影响力分析。
  • 图数据库中间件:作为图数据库中间件,提供统一的查询接口和图处理能力,使不同的图数据库可以互操作。
  • 大数据图处理:与大数据处理框架(如Apache Spark和Apache Flink)集成,进行大规模图处理和分布式图计算。

以上是关于图数据库和图处理库的简介和示例代码。希望对您有帮助!如果您有任何问题,请随时提问。

3. JGraphT(图理论库)

3.1 库概述

JGraphT是一个开源的Java图理论库,用于表示和操作各种类型的图。它提供了丰富的图模型、图算法和图操作,使开发人员能够使用图理论进行复杂的图分析和处理。

3.2 图模型与数据结构

JGraphT支持多种图模型和数据结构,包括有向图和无向图。

3.2.1 有向图(Directed Graph)

有向图是一种图模型,其中每条边都有一个方向。有向图中的边称为有向边,表示从一个顶点指向另一个顶点的方向。

import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultDirectedGraph;
import org.jgrapht.graph.DefaultEdge;public class JGraphTDirectedGraphExample {public static void main(String[] args) {Graph<String, DefaultEdge> directedGraph = new DefaultDirectedGraph<>(DefaultEdge.class);directedGraph.addVertex("A");directedGraph.addVertex("B");directedGraph.addVertex("C");directedGraph.addEdge("A", "B");directedGraph.addEdge("B", "C");directedGraph.addEdge("C", "A");}
}
3.2.2 无向图(Undirected Graph)

无向图是一种图模型,其中边没有方向。无向图中的边可以双向连接两个顶点。

import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultUndirectedGraph;
import org.jgrapht.graph.DefaultEdge;public class JGraphTUndirectedGraphExample {public static void main(String[] args) {Graph<String, DefaultEdge> undirectedGraph = new DefaultUndirectedGraph<>(DefaultEdge.class);undirectedGraph.addVertex("A");undirectedGraph.addVertex("B");undirectedGraph.addVertex("C");undirectedGraph.addEdge("A", "B");undirectedGraph.addEdge("B", "C");undirectedGraph.addEdge("C", "A");}
}
3.3 图算法与操作

JGraphT提供了许多常用的图算法和操作,使开发人员能够对图进行复杂的分析和操作。

3.3.1 最短路径算法

JGraphT提供了多种最短路径算法,如Dijkstra算法和Floyd-Warshall算法,用于在图中查找两个顶点之间的最短路径。

import org.jgrapht.Graph;
import org.jgrapht.alg.shortestpath.DijkstraShortestPath;
import org.jgrapht.graph.DefaultDirectedGraph;
import org.jgrapht.graph.DefaultEdge;public class JGraphTShortestPathExample {public static void main(String[] args) {Graph<String, DefaultEdge> directedGraph = new DefaultDirectedGraph<>(DefaultEdge.class);directedGraph.addVertex("A");directedGraph.addVertex("B");directedGraph.addVertex("C");directedGraph.addEdge("A", "B");directedGraph.addEdge("B", "C");directedGraph.addEdge("C", "A");DijkstraShortestPath<String, DefaultEdge> shortestPath = new DijkstraShortestPath<>(directedGraph);double distance = shortestPath.getPathWeight("A", "C");}
}
3.3.2 最小生成树算法

JGraphT提供了多种最小生成树算法,如Prim算法和Kruskal算法,用于在图中查找生成树。

import org.jgrapht.Graph;
import org.jgrapht.alg.spanning.PrimMinimumSpanningTree;
import org.jgrapht.graph.DefaultUndirectedGraph;
import org.jgrapht.graph.DefaultEdge;public class JGraphTMinimumSpanningTreeExample {public static void main(String[] args) {Graph<String, DefaultEdge> undirectedGraph = new DefaultUndirectedGraph<>(DefaultEdge.class);undirectedGraph.addVertex("A");undirectedGraph.addVertex("B");undirectedGraph.addVertex("C```javaGraph<String, DefaultEdge> undirectedGraph = new DefaultUndirectedGraph<>(DefaultEdge.class);undirectedGraph.addVertex("A");undirectedGraph.addVertex("B");undirectedGraph.addVertex("C");undirectedGraph.addEdge("A", "B");undirectedGraph.addEdge("B", "C");undirectedGraph.addEdge("C", "A");PrimMinimumSpanningTree<String, DefaultEdge> mst = new PrimMinimumSpanningTree<>(undirectedGraph);SpanningTree<DefaultEdge> spanningTree = mst.getSpanningTree();double weight = spanningTree.getTotalWeight();}
}
3.4 图可视化与扩展
3.4.1 图可视化工具

JGraphT本身并不提供图可视化功能,但可以与其他图可视化工具集成,如JUNG、GraphStream和yFiles。

3.4.2 JGraphT 扩展模块

JGraphT还提供了一些扩展模块,如jgrapht-ext模块,它包含了一些额外的图算法和数据结构,如流网络算法、最大流算法和图的拓扑排序算法。

<dependency><groupId>org.jgrapht</groupId><artifactId>jgrapht-ext</artifactId><version>1.5.1</version>
</dependency>

4. ArangoDB(多模型数据库)

4.1 多模型数据库概述

ArangoDB是一个多模型数据库,可以存储和查询多种类型的数据模型,包括文档型、图型和键-值型数据模型。它提供了一个统一的查询语言和API,使开发人员能够灵活地处理不同类型的数据。

4.2 数据模型与查询语言

ArangoDB支持多种数据模型,包括文档型、图型和键-值型数据模型。每种数据模型都有自己的查询语言和操作。

4.2.1 文档型数据模型

文档型数据模型是一种基于文档的数据模型,数据以文档的形式存储,并使用类似JSON的格式表示。ArangoDB使用AQL(ArangoDB Query Language)作为文档型数据模型的查询语言。

4.2.2 图型数据模型

图型数据模型是一种用于表示实体和它们之间关系的数据模型。ArangoDB使用AQL和图查询语言(Gharial)来查询和操作图数据。

4.2.3 键-值型数据模型

键-值型数据模型是一种简单的键值对存储模型,每个数据项由一个唯一的键和对应的值组成。ArangoDB提供了键-值型数据存储引擎,并使用AQL进行查询操作。

4.3 多模型数据操作与API

ArangoDB提供了多种API来操作多模型数据,包括AQL查询语言和Java API。

4.3.1 AQL 查询语言

AQL是ArangoDB的查询语言,用于在多模型数据上执行查询和操作。它支持文档型数据和图数据的查询,提供了丰富的查询语法和操作符。

4.3.2 Java API

ArangoDB还提供了Java API,用于在Java应用程序中与ArangoDB进行交互。Java API提供了对多模型数据的CRUD操作和查询功能。

4.4 应用场景与案例

ArangoDB适用于多种应用场景,包括:

  • 文档存储和查询:适用于存储和查询具有复杂结构的文档数据,如博客、新闻和社交媒体数据。
  • 图分析和图数据库:适用于构建和查询具有复杂关系的图数据,如社交网络、知识图谱和推荐系统。
  • 键值存储和缓存:适用于快速存储和检索键值对数据,如用户会话信息和配置数据。
  • 分布式应用程序:适用于构建分布式应用程序,通过分片和复制来提供高可用性和可伸缩性。

一些使用ArangoDB的案例包括:

  • 阿里巴巴:使用ArangoDB构建大规模的线上图数据库,用于社交网络分析和推荐系统。
  • Grindr:使用ArangoDB构建社交网络应用程序的后端,用于存储和查询用户数据和关系。
  • ArangoDB自身:ArangoDB使用自己的多模型能力来存储和查询文档、图和键值数据,以提供高性能和灵活性。

ArangoDB是一种多模型数据库,支持文档型、图型和键-值型数据模型。以下是一个使用ArangoDB Java API进行多模型数据操作的示例代码:

import com.arangodb.ArangoDB;
import com.arangodb.ArangoDatabase;
import com.arangodb.entity.CollectionEntity;
import com.arangodb.entity.DocumentCreateEntity;
import com.arangodb.entity.EdgeDefinition;
import com.arangodb.entity.GraphEntity;
import com.arangodb.model.DocumentCreateOptions;
import com.arangodb.model.EdgeCreateOptions;
import com.arangodb.model.GraphCreateOptions;public class ArangoDBExample {public static void main(String[] args) {// 连接到ArangoDB数据库ArangoDB arangoDB = new ArangoDB.Builder().build();// 创建数据库String dbName = "myDatabase";arangoDB.createDatabase(dbName);// 切换到指定数据库ArangoDatabase db = arangoDB.db(dbName);// 创建文档集合String collectionName = "myCollection";CollectionEntity collection = db.createCollection(collectionName);// 插入文档数据DocumentCreateEntity<MyDocument> document = db.collection(collectionName).insertDocument(new MyDocument("1", "John Doe"), new DocumentCreateOptions());// 创建图String graphName = "myGraph";EdgeDefinition edgeDefinition = new EdgeDefinition().collection(collectionName).from("vertexCollection").to("vertexCollection");GraphEntity graph = db.createGraph(graphName, edgeDefinition, new GraphCreateOptions());// 创建顶点DocumentCreateEntity<MyVertex> vertex1 = db.graph(graphName).vertexCollection("vertexCollection").insertVertex(new MyVertex("1", "Alice"));DocumentCreateEntity<MyVertex> vertex2 = db.graph(graphName).vertexCollection("vertexCollection").insertVertex(new MyVertex("2", "Bob"));// 创建边EdgeCreateOptions options = new EdgeCreateOptions().waitForSync(true);db.graph(graphName).edgeCollection(collectionName).insertEdge(new MyEdge("1", vertex1.getId(), vertex2.getId()), options);// 关闭数据库连接arangoDB.shutdown();}
}// 自定义文档类型
class MyDocument {private String id;private String name;// 构造函数、Getter和Setter省略// ...
}// 自定义顶点类型
class MyVertex {private String id;private String name;// 构造函数、Getter和Setter省略// ...
}// 自定义边类型
class MyEdge {private String id;private String from;private String to;// 构造函数、Getter和Setter省略// ...
}

在这个示例代码中,我们将ArangoDB的相关操作嵌入到 ArangoDBExample 类的 main 方法中。这里使用了ArangoDB的Java API来连接到ArangoDB数据库,并进行多模型数据操作。

请注意,你需要根据自己的环境和需求进行适当的配置和调整,例如更改数据库名称、集合名称以及自定义数据类型的属性。确保在运行代码之前,已经正确安装ArangoDB,并导入相应的ArangoDB Java驱动程序。

这个示例代码演示了如何创建ArangoDB数据库、集合、文档和图,以及如何插入和操作数据。根据你的具体需要,你可以根据ArangoDB的API文档进行更多的操作和查询。

总结

本文对Neo4j、Apache TinkerPop、JGraphT和ArangoDB进行了全面的介绍和比较。我们探讨了它们的特点、数据模型、查询语言和API,以及适用的应用场景。无论是需要处理复杂关系数据的图数据库,还是支持多种数据模型的多模型数据库,读者都可以根据自己的需求做出明智的选择。这些数据库在各自的领域中都有广泛的应用,可以帮助开发人员构建高效和灵活的数据处理解决方案。

相关文章:

【Java万花筒】图数据库 vs 多模型数据库:哪种数据库适合你的应用场景?

解密图数据库与多模型数据库&#xff1a;特性、查询语言和成功案例的全景展示 前言 图数据库和多模型数据库在当今数据处理领域扮演着重要的角色。本文将介绍四个主要的图数据库和多模型数据库&#xff1a;Neo4j、Apache TinkerPop、JGraphT和ArangoDB&#xff0c;探索它们的…...

【射影几何13 】梅氏定理和塞瓦定理探讨

梅氏定理和塞瓦定理 目录 一、说明二、梅涅劳斯&#xff08;Menelaus&#xff09;定理三、塞瓦(Giovanni Ceva&#xff09;定理四、塞瓦点的推广 一、说明 在射影几何中&#xff0c;梅涅劳斯&#xff08;Menelaus&#xff09;定理和塞瓦定理是非常重要的基本定理。通过这两个定…...

Powershell Install 一键部署Openssl+certificate证书创建

前言 Openssl 是一个方便的实用程序,用于创建自签名证书。您可以在所有操作系统(如 Windows、MAC 和 Linux 版本)上使用 OpenSSL。 Windows openssl 下载 前提条件 开启wmi,配置网卡,参考 自签名证书 创建我们自己的根 CA 证书和 CA 私钥(我们自己充当 CA)创建服务器…...

SERVLET线程模型

1. SERVLET线程模型 Servlet规范定义了两种线程模型来阐明Web容器应该如何在多线程环境中处理servlet。第一种模型称为多线程模型,默认在此模型内执行所有servlet。在此模型中,每次客户机向servlet发送请求时Web容器都启动一个新线程。这意味着可能有多个线程同时访问servle…...

【开源】基于JAVA+Vue+SpringBoot的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…...

【蓝桥杯冲冲冲】Prime Gift

【蓝桥杯冲冲冲】Prime Gift 蓝桥杯备赛 | 洛谷做题打卡day31 文章目录 蓝桥杯备赛 | 洛谷做题打卡day31Prime Gift题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示题解代码我的一些话 Prime Gift 题面翻译 给你 n n n 个…...

【PyQt】06-.ui文件转.py文件

文章目录 前言方法一、基本脚本查看自己的uic安装目录 方法二、添加到扩展工具里面&#xff08;失败了&#xff09;方法二的成功步骤总结 前言 方法一、基本脚本 将Qt Designer&#xff08;一种图形用户界面设计工具&#xff09;生成的.ui文件转换为Python代码的脚本。 pytho…...

λ-矩阵知识点

原文:链接 λ-矩阵 若矩阵 A \mathbf{A} A 的元素为关于 λ λ λ 的多项式&#xff0c;则称 A \mathbf{A} A 为 λ λ λ-矩阵 (表示为 A ( λ ) \mathbf{A}(λ) A(λ)). λ λ λ-矩阵也存在秩、逆、初等变换、相抵的概念, 但是有一些不同. 定义. λ λ λ-矩阵的秩是…...

cocos creator 3.x 预制体无法显示

双击预制体&#xff0c;进入详情页&#xff0c;没有显示资源 Bomb 是个预制体&#xff0c;但是当我双击进来什么都没有了&#xff0c;无法对预制体进行可视化编辑 目前我只试出来一个解决方法&#xff1a; 把预制体拖进Canvas文件中&#xff0c;这样就能展示到屏幕上&#xff…...

Tomcat之虚拟主机

1.创建存放网页的目录 mkdir -p /web/{a,b} 2.添加jsp文件 vi /web/a/index.jsp <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <html> <head><title>JSP a page</title> </head> …...

前后端数据校验

前端校验内容 前端开发中的必要校验&#xff0c;可以保证用户输入的数据的准确性、合法性和安全性。同时&#xff0c;这些校验也有助于提供良好的用户体验和防止不必要的错误提交到后端。 1、必填字段校验&#xff1a; 对于必填的字段&#xff0c;需确保用户输入了有效的数据…...

Python把png图片转成jpg图片

在Python中&#xff0c;您可以使用PIL&#xff08;Python Imaging Library&#xff0c;也被称为Pillow&#xff09;库来将PNG图片转换为JPG格式。以下是一个简单的示例&#xff1a; 首先&#xff0c;确保你已经安装了Pillow库。如果没有安装&#xff0c;可以使用pip来安装&…...

STM32搭建开发环境

常用开发工具简介 集成开发环境 MDK&#xff1a;全名RealViewMDK&#xff0c;是Keil公司&#xff08;已被ARM收购的&#xff09;一款集成开发环境&#xff0c;界面美观&#xff0c;简单易用&#xff0c;是STM32最常用的集成开发环境EWARM&#xff1a;IAR公司的一款集成开发环…...

C#入门详解_01_课程简介、C#语言简介、开发环境和学习资料的准备

文章目录 1. 课程简介2. C#语言简介3.开发环境与学习资料 1. 课程简介 开设本课程的目的 传播C#开发的知识&#xff0c;让更多的人有机会接触到软件开发行业引导有兴趣或者想转行的朋友进入软件开发行业 课程内容 完整讲述C#语言在实际软件开发中的应用采用知识讲述加实例程序…...

C++服务器端开发(2):确定服务器框架

选择C服务器框架时&#xff0c;可以考虑&#xff1a; 并发性能&#xff1a;C的强项之一是其并发性能。选择一个具有高并发处理能力的服务器框架&#xff0c;可以更好地满足大量并发请求的需求。例如&#xff0c;libevent、Boost.Asio和CppServer都是具有良好并发性能的C服务器框…...

CGAL::2D Arrangements-5

5.Arrangement无界曲线 前几章中构建和操作的所有Arrangement都只由线段引起&#xff0c;线段尤其是有界曲线。这样的Arrangement总是具有一个包含所有其他Arrangement特征的unbounded face。在本节中&#xff0c;我们将解释如何构造无界曲线的Arrangement。为了简化说明&…...

登录+JS逆向进阶【过咪咕登录】(附带源码)

JS渗透之咪咕登录 每篇前言&#xff1a;咪咕登录参数对比 captcha参数enpassword参数搜索enpassword参数搜索J_RsaPsd参数setPublic函数encrypt加密函数运行时可能会遇到的问题此部分改写的最终形态JS代码&#xff1a;运行结果python编写脚本运行此JS代码&#xff1a;运行结果&…...

CTF秀 ctfshow WEB入门 web1-10 wp精讲

目录 web1_查看源码 web3_抓包 web4-9_目录文件 web10_cookie web1_查看源码 ctrlu 查看源码 web3_抓包 查看源码&#xff0c;无果 抓包&#xff0c;找到flag web4-9_目录文件 GitHub - maurosoria/dirsearch: Web path scanner 下载dirsearch工具扫一下就都出来了 web4-…...

centos安装inpanel

前置条件 安装python yum -y install python 安装 cd /usr/local git clone https://gitee.com/WangZhe168_admin/inpanel.git cd inpanel python install.py 安装过程需要设置账户 密码 端口号 我设置的是admin:admin 10050 使用 打开浏览器,输入 http://192.168.168.…...

聊聊PowerJob Worker的ServerAddress

序 本文主要研究一下PowerJob Worker的ServerAddress PowerJobAutoConfiguration tech/powerjob/worker/autoconfigure/PowerJobAutoConfiguration.java BeanConditionalOnMissingBeanpublic PowerJobSpringWorker initPowerJob(PowerJobProperties properties) {PowerJobPr…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...