Java中的圖數據庫應用:Neo4j入門

第1章:引言

在數據驅動的時代,咱們處理的不僅僅是數字和文本,還有復雜的關系和網絡。想象一下社交網絡中人與人之間錯綜復雜的聯系,或者是互聯網上網頁之間的鏈接關系,傳統的表格數據庫已經難以高效地處理這些關系密集型的數據了。這時候,圖數據庫就登場了,它以圖的形式存儲數據,節點代表實體,邊代表實體之間的關系,非常適合處理復雜的網絡關系。

那為什么咱們要選擇Neo4j作為圖數據庫的代表來深入學習呢?首先,Neo4j是目前最流行的圖數據庫之一,它提供了非常直觀的圖形化界面和強大的查詢語言Cypher,讓管理和查詢圖數據變得簡單直觀。更重要的是,Neo4j具有非常好的性能表現,即便是在處理大規模數據時也能保持高效的查詢速度。對于Java程序員來說,Neo4j提供了良好的Java API支持,讓咱們可以輕松地在Java應用中集成和使用Neo4j。

第2章:Neo4j基礎

要理解Neo4j,咱們得先搞清楚幾個核心概念:節點(Node)、關系(Relationship)、屬性(Property)和標簽(Label)。節點可以理解為圖中的一個個實體,比如人、地點或事物。每個節點都可以有多個標簽,用于分類或標記。關系則描述了節點之間的聯系,每個關系都有方向,指從一個節點指向另一個節點,并且關系本身也可以有屬性。屬性則是節點或關系的詳細信息,比如人的姓名、地點的名稱等。

接下來,讓咱們用一個簡單的例子來看看Neo4j是如何工作的。假設咱們要在Neo4j中建立一個表示朋友關系的小網絡。在這個網絡中,每個人都是一個節點,人與人之間的朋友關系則是邊。

// 連接到Neo4j數據庫
Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("用戶名", "密碼"));
try (Session session = driver.session()) {// 創建節點String createNodeQuery = "CREATE (a:Person {name: '小明'}) RETURN a";session.run(createNodeQuery);// 創建另一個節點,并建立朋友關系String createAnotherNodeAndRelationQuery = "CREATE (b:Person {name: '小紅'})-[:FRIEND]->(a:Person {name: '小明'}) RETURN b";session.run(createAnotherNodeAndRelationQuery);
}

在這個例子中,咱們首先創建了兩個標簽為Person的節點,分別代表“小明”和“小紅”,然后通過:FRIEND關系將它們連接起來。這段代碼雖然簡單,但已經涵蓋了Neo4j操作的核心:節點的創建、關系的建立以及屬性的賦值。

通過這個例子,咱們可以看出,Neo4j使得圖數據的表示和查詢變得直觀而簡單。無論是社交網絡、推薦系統還是復雜的網絡分析,Neo4j都能提供強大的支持。而且,對于習慣了Java開發的小黑來說,通過Neo4j提供的Java API,將這些功能整合到自己的應用中只是手到擒來的事情。

小黑偷偷告訴你一個生財信息差網站: 小黑的生財資料站

第3章:安裝與配置Neo4j

咱們要開始動手實踐了,第一步自然是將Neo4j安裝到咱們的機器上。不管你是用Windows, Linux還是Mac,Neo4j的安裝過程都設計得非常友好,接下來就一起看看怎么在這些操作系統上搞定它。

在Windows上安裝Neo4j

對于Windows用戶來說,咱們可以直接從Neo4j官網下載Neo4j的Windows版安裝包。下載完成后,雙擊安裝文件,跟著安裝向導走就行。安裝向導會提示咱們設置數據庫的存儲路徑、HTTP和Bolt端口等,通常情況下,保持默認設置即可。安裝完成后,咱們可以通過Neo4j Desktop應用來管理Neo4j數據庫,非常方便。

在Linux上安裝Neo4j

Linux用戶可能更傾向于使用命令行,所以咱們可以通過包管理器來安裝Neo4j。以Ubuntu為例,咱們可以先添加Neo4j的倉庫,然后使用apt-get命令安裝:

wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add -
echo 'deb https://debian.neo4j.com stable 4.x' | sudo tee -a /etc/apt/sources.list.d/neo4j.list
sudo apt-get update
sudo apt-get install neo4j

安裝完成后,咱們可以使用sudo service neo4j start命令來啟動Neo4j服務。

在Mac上安裝Neo4j

Mac用戶可以通過Homebrew來安裝Neo4j,這是Mac下非常流行的包管理器。打開終端,輸入以下命令即可安裝:

brew install neo4j

安裝完成后,使用neo4j start命令來啟動Neo4j服務。

基本配置介紹

不管是哪個操作系統,安裝完成后咱們都需要進行一些基本的配置。最重要的就是關于安全性的配置,特別是設置數據庫的用戶名和密碼。Neo4j在首次啟動時會要求設置這些信息,確保你的數據庫不會被未授權的人訪問。

此外,還可以通過修改conf/neo4j.conf文件來進行更多高級配置,比如調整內存設置、配置日志文件的位置等。對于大多數初學者來說,剛開始使用默認配置就已經足夠了。隨著咱們對Neo4j的了解加深,再根據實際需要進行相應的調整。

安裝并配置好Neo4j之后,咱們就可以開始探索圖數據庫的強大功能了。通過Neo4j Browser,咱們可以直觀地查看數據庫中的數據,執行Cypher查詢語句,以及進行數據庫的管理工作,非常直觀和方便。

到這里,咱們已經成功搭建了自己的Neo4j環境,接下來就可以開始真正的圖數據庫之旅了。通過上述步驟,無論是在Windows、Linux還是Mac上,咱們都能輕松地安裝和配置Neo4j,為后續的學習和實踐打下堅實的基礎。

第4章:Cypher查詢語言入門

跟著小黑一起,咱們現在進入Neo4j的心臟地帶——Cypher查詢語言。Cypher是Neo4j專門為圖數據查詢和操作設計的語言,它的語法非常直觀,讓咱們能夠輕松地描述和處理圖中的數據。沒有Cypher,咱們要操作圖數據就像是盲人摸象,所以掌握它對于使用Neo4j來說至關重要。

Cypher語言的基本結構

Cypher的設計哲學是讓查詢語句盡可能地貼近自然語言。咱們來看一個簡單的例子,查詢名叫“小明”的人的朋友:

MATCH (a:Person {name: "小明"})-[:FRIEND]->(b)
RETURN b

這段查詢的含義是:“找到一個名叫‘小明’的人a,然后找到所有a通過FRIEND關系指向的朋友b,最后返回這些朋友b的信息。”在這里,MATCHRETURN是Cypher語句中最常用的兩個關鍵字,分別用于匹配圖中的模式和返回結果。

常用查詢、插入、更新和刪除操作
  • 查詢(Querying)

查詢是最常見的操作,上面的例子就是一個查詢操作。再看一個例子,咱們如何找到所有人的朋友?

MATCH (a:Person)-[:FRIEND]->(b)
RETURN a, b

這個查詢會返回所有具有FRIEND關系的人的組合。

  • 插入(Creating)

插入新的節點和關系也很簡單。比如,咱們想在圖中添加一個新的人“小紅”:

CREATE (a:Person {name: "小紅"})

如果咱們還想添加一個“小紅”和“小明”之間的朋友關系,可以這樣寫:

MATCH (a:Person {name: "小明"}), (b:Person {name: "小紅"})
CREATE (a)-[:FRIEND]->(b)
  • 更新(Updating)

更新數據也是咱們常常需要做的操作,比如修改“小明”的名字為“大明”:

MATCH (a:Person {name: "小明"})
SET a.name = "大明"
  • 刪除(Deleting)

最后,如果需要刪除某個節點或關系,可以使用DELETE關鍵字。但要注意,如果要刪除一個節點,需要先刪除與之相關的所有關系。比如,刪除“小紅”及其所有朋友關系:

MATCH (a:Person {name: "小紅"})-[r]-()
DELETE r, a

通過上述示例,咱們可以看到Cypher查詢語言的強大之處,它使得圖數據的查詢和操作變得簡單直觀。對于Java程序員來說,掌握Cypher是使用Neo4j的關鍵,只有熟練運用Cypher,才能在圖數據的海洋中自如航行。隨著實踐的深入,咱們會發現更多Cypher的高級特性,這將大大提升咱們處理圖數據的能力。

第5章:Neo4j與Java的集成

走到這一步,咱們已經對Neo4j有了基本的了解,也學會了使用Cypher語言進行數據的查詢和操作。現在,小黑要帶咱們探索如何在Java應用中集成和使用Neo4j,讓咱們的Java應用能夠直接操作圖數據庫,實現更復雜的業務邏輯。

使用Neo4j Java驅動程序

要在Java應用中使用Neo4j,首先得通過添加Neo4j Java驅動的依賴來開始。如果咱們使用Maven構建項目,只需要在pom.xml文件中添加如下依賴:

<dependency><groupId>org.neo4j.driver</groupId><artifactId>neo4j-java-driver</artifactId><version>4.x.x</version>
</dependency>

請確保將4.x.x替換為當前最新的穩定版本。

配置Java項目以連接Neo4j數據庫

有了驅動,下一步就是配置咱們的Java應用,讓它能夠連接到Neo4j數據庫。這里,小黑給大家展示一個簡單的例子,如何在Java中創建一個Neo4j的連接并執行一個簡單的Cypher查詢。

import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.Session;public class Neo4jExample {public static void main(String[] args) {// 連接到Neo4j數據庫Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("用戶名", "密碼"));try (Session session = driver.session()) {// 執行一個Cypher查詢String cypherQuery = "MATCH (n:Person) RETURN n.name AS name";session.run(cypherQuery).list(record -> record.get("name").asString()).forEach(System.out::println);} finally {driver.close();}}
}

在這段代碼中,咱們首先創建了一個Driver對象,用于管理與Neo4j數據庫的連接。Driver對象需要咱們提供數據庫的URL、用戶名和密碼。接下來,使用try-with-resources語句來確保會話(Session)在使用完畢后能夠被自動關閉。在會話中,咱們執行了一個簡單的Cypher查詢,這個查詢會找出所有標簽為Person的節點,并返回它們的名字。最后,咱們遍歷查詢結果,并將每個人的名字打印出來。

這個例子雖然簡單,但已經包含了在Java應用中使用Neo4j進行數據庫操作的基本流程。通過這種方式,咱們可以將復雜的業務邏輯和數據處理邏輯用Java實現,而數據存儲和關系處理則交給Neo4j來完成,這樣既能發揮Java在業務處理上的強大能力,也能利用Neo4j在圖數據管理上的優勢,是一種非常理想的解決方案。

隨著對Neo4j的深入使用,咱們會發現還有更多高級特性和最佳實踐等著咱們去探索,比如事務管理、異步查詢等。但通過這個基礎的入門,咱們已經能夠開始在Java應用中集成和使用Neo4j了,這為咱們打開了一個全新的圖數據世界的大門。

第6章:實戰:構建一個簡單的Java應用使用Neo4j

好了,經過之前的鋪墊,現在小黑要帶著咱們進入更加實際的操作環節了。這一章,咱們將一起動手構建一個簡單的Java應用,這個應用會使用Neo4j來存儲和查詢數據。通過這個實戰案例,咱們能夠更深刻地理解如何在實際項目中應用Neo4j。

設計一個簡單的圖模型

首先,咱們需要設計一個圖模型。假設咱們要構建一個社交網絡應用,核心功能是用戶可以添加朋友。在這個應用中,每個用戶都是一個節點,用戶之間的朋友關系則通過邊來表示。

在Neo4j中,咱們可以這樣定義用戶節點和朋友關系:

  • 用戶節點:標簽為Person,屬性包含name(姓名)。
  • 朋友關系:類型為FRIEND,可以添加屬性如since(成為朋友的時間)。
編寫CRUD操作的示例代碼

接下來,小黑會展示如何在Java中實現基本的CRUD(創建、讀取、更新、刪除)操作。

  • 創建用戶和朋友關系
import org.neo4j.driver.*;public class SocialNetworkApp {private final Driver driver;public SocialNetworkApp(String uri, String user, String password) {driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password));}public void addFriend(String personName1, String personName2, String since) {try (Session session = driver.session()) {String query = "MERGE (p1:Person {name: $name1}) " +"MERGE (p2:Person {name: $name2}) " +"MERGE (p1)-[:FRIEND {since: $since}]->(p2)";session.run(query, Parameters.parameters("name1", personName1, "name2", personName2, "since", since));}}public static void main(String[] args) {SocialNetworkApp app = new SocialNetworkApp("bolt://localhost:7687", "用戶名", "密碼");app.addFriend("小明", "小紅", "2023-01-01");}
}

在這個例子中,addFriend方法用于在數據庫中添加兩個用戶節點,并創建它們之間的FRIEND關系。這里使用了MERGE關鍵字,它會檢查相應的節點和關系是否存在,如果不存在,則創建它們;如果已存在,則不做任何操作。這避免了重復創建相同的數據。

  • 查詢朋友

接下來,咱們看看如何查詢一個用戶的所有朋友:

public void listFriends(String personName) {try (Session session = driver.session()) {String query = "MATCH (p:Person {name: $name})-[:FRIEND]->(friend) RETURN friend.name";session.run(query, Values.parameters("name", personName)).list(record -> record.get("friend.name").asString()).forEach(System.out::println);}
}

這段代碼中,listFriends方法通過傳入的用戶名來查詢該用戶的所有朋友,并打印出朋友的名字。

查詢優化和性能考慮

在實際應用中,查詢性能是非常重要的。Neo4j提供了多種方式來優化查詢性能,比如使用索引來加速查找。在大規模數據的場景下,合理的查詢優化可以顯著提升應用的響應速度和用戶體驗。

public void createIndexOnPersonName() {try (Session session = driver.session()) {String query = "CREATE INDEX ON :Person(name)";session.run(query);}
}

創建索引后,基于name屬性的查詢會變得更快。

到這里,咱們已經完成了一個簡單的社交網絡應用的核心

第7章:高級特性和最佳實踐

隨著小黑和咱們一步步深入Neo4j的世界,現在來到了探索其高級特性和分享一些最佳實踐的時刻。理解和應用這些內容,能幫助咱們在使用Neo4j構建應用時,既能充分發揮其性能,又能保證數據的安全和穩定性。

索引和約束的使用

為了提高查詢效率,使用索引是一個非常重要的策略。在Neo4j中,咱們可以為經常查詢的屬性創建索引,比如用戶的名字。除此之外,約束也是一個有力的工具,它能保證數據庫中數據的唯一性和一致性。

public void createConstraints() {try (Session session = driver.session()) {String query = "CREATE CONSTRAINT ON (p:Person) ASSERT p.name IS UNIQUE";session.run(query);}
}

這段代碼創建了一個約束,確保每個Person節點的name屬性是唯一的。這不僅有助于避免重復數據的產生,還能提升基于name屬性的查詢效率。

處理大規模數據的策略

在處理大規模數據時,咱們需要考慮數據的分片和負載均衡。雖然Neo4j是高度優化的圖數據庫,但在面對巨大的數據集時,合理的數據分布和查詢優化仍然至關重要。使用Neo4j集群,可以實現數據的自動分片和負載均衡,從而提高應用的可伸縮性和穩定性。

安全性考慮和配置

數據的安全性是任何應用都需要考慮的問題。在使用Neo4j時,咱們應該利用其提供的安全特性,比如基于角色的訪問控制(RBAC),以及使用加密連接來保護數據傳輸過程中的安全。

Driver driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password), Config.builder().withEncryption().build());

在創建驅動程序連接時啟用加密,確保數據在傳輸過程中的安全。

最佳實踐
  • 定期備份數據:定期備份數據庫,以防數據丟失或損壞。
  • 監控和調優:使用Neo4j提供的監控工具來觀察數據庫的性能指標,根據實際情況進行調優。
  • 合理規劃圖模型:一個良好設計的圖模型是高效使用Neo4j的關鍵。在設計圖模型時,要考慮查詢模式,盡量減少跨節點的查詢次數,以提高性能。
  • 使用參數化查詢:在執行Cypher查詢時,使用參數化查詢可以提高性能并防止注入攻擊。

通過以上的高級特性和最佳實踐,咱們能夠更加高效、安全地使用Neo4j來構建應用。雖然這些只是冰山一角,但已經足夠咱們開始構建健壯、高效的圖數據庫應用。隨著經驗的積累,咱們會逐漸掌握更多的技巧和策略,讓應用更加完善。

第8章:結語

隨著小黑和咱們一起走過了Neo4j的入門到進階,現在是時候做一個小小的總結了。從最初對圖數據庫的概念理解,到Neo4j的安裝與配置,再到通過Cypher語言與Java驅動進行數據的增刪改查,以及最后探討的高級特性和最佳實踐,咱們已經涵蓋了使用Neo4j開發應用所需的基礎知識和技能。

通過這一系列的學習,咱們不僅掌握了如何在Java應用中集成和使用Neo4j,還了解了如何優化查詢、處理大規模數據、確保數據安全以及遵循最佳實踐來提高應用的性能和穩定性。這些知識和技能將在咱們今后的開發工作中發揮重要作用,無論是構建復雜的社交網絡應用、推薦系統還是其他需要處理復雜關系數據的場景。

在圖數據庫的世界里,Neo4j只是冰山一角,但它的強大功能和靈活性使其成為了一個非常出色的起點。隨著技術的深入,咱們會發現更多高級特性和應用場景,這些都將進一步拓寬咱們的技術視野。

最后,小黑想提醒大家,技術是不斷進步的,今天學到的知識可能明天就會有更新。因此,保持學習的態度,持續關注Neo4j以及圖數據庫領域的最新動態,是每個技術人應該做的。同時,實踐是檢驗真理的唯一標準,不要害怕動手實驗新的想法和技術,只有通過實踐,才能真正掌握和深入理解Neo4j的強大能力。

在這個數據驅動的時代,圖數據庫無疑為咱們提供了一個強有力的工具,幫助咱們解決了許多傳統數據庫難以應對的問題。希望通過這篇博客,咱們能夠對Neo4j有一個全面的了解,并在未來的項目中發揮它的最大價值。讓咱們一起期待,在圖數據的海洋中探索出更多的寶藏吧!


更多推薦

詳解SpringCloud之遠程方法調用神器Fegin

掌握Java Future模式及其靈活應用

小黑整的視頻會園優惠站

小黑整的生財資料站

使用Apache Commons Chain實現命令模式

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715224.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715224.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

每日leetcode--最大數

正題之前 三玖yyds&#xff01;&#xff01;&#xff01; 題目 給定一組非負整數 nums&#xff0c;重新排列每個數的順序&#xff08;每個數不可拆分&#xff09;使之組成一個最大的整數。 注意&#xff1a;輸出結果可能非常大&#xff0c;所以你需要返回一個字符串而不是整…

籃球游戲中的挑戰精神與慪氣心理:扣籃被帽后的再度沖擊

在籃球比賽中&#xff0c;扣籃無疑是最具觀賞性和震撼力的動作之一&#xff0c;它展示了球員的爆發力、技巧和自信。而在籃球游戲中&#xff0c;玩家即便面臨連續扣籃被蓋帽的挫折&#xff0c;仍渴望繼續殺入內線嘗試扣籃的現象&#xff0c;實則是體育競技精神、挑戰意識與慪氣…

梵寧教育:警惕網絡詐騙,守護青春未來

隨著互聯網的普及和科技的飛速發展&#xff0c;網絡已經深入到了我們生活的方方面面&#xff0c;為大學生提供了前所未有的便利與機遇。然而&#xff0c;與此同時&#xff0c;網絡詐騙也悄然滋生&#xff0c;成為威脅大學生安全的一大隱患。梵寧教育在此鄭重提醒廣大大學生&…

LeetCode 熱題100 刷題筆記

一&#xff1a;哈希表 一般哈希表都是用來快速判斷一個元素是否出現集合里。 直白來講其實數組就是一張哈希表&#xff0c;哈希表中關鍵碼就是數組的索引下標&#xff0c;然后通過下標直接訪問數組中的元素。 1.兩數之和 題目鏈接&#xff1a;. - 力扣&#xff08;LeetCode…

Javaweb之SpringBootWeb案例之自動配置的原理分析的詳細解析

3.2.3 原理分析 3.2.3.1 源碼跟蹤 前面我們講解了在項目當中引入第三方依賴之后&#xff0c;如何加載第三方依賴中定義好的bean對象以及配置類&#xff0c;從而完成自動配置操作。那下面我們通過源碼跟蹤的形式來剖析下SpringBoot底層到底是如何完成自動配置的。 源碼跟蹤技巧…

[VSCode插件] 輕量級靜態博客 - MDBlog

MDBlog VSCode插件&#xff0c;基于Markdown的輕量級靜態博客系統&#xff0c;同時支持導出為可以部署的靜態博客。 倉庫 MDBlog 1. Features 博客基礎功能&#xff1a;分類管理、文章管理、自動生成索引快捷指令&#xff1a;快捷輸入表格、mermaid、wavedrom、代碼塊發布&a…

[electron雜項] 記錄學習electron碰到問題(持續更新)

無法生成 node_modules文件夾 如前面所說的&#xff0c;如果要用vscode的代碼補全&#xff0c;那么就要把 electron.d.ts文件拷貝到項目的 node_modules文件夾下。一般情況下是通過npm install生成 node_modules 文件夾。但是有時發現根本生成不了生成了一個 xxxxlock的文件。…

Redis--內存回收機制詳解

什么是內存回收機制? 眾所周知Redis之所以性能高是因為數據都存在內存中&#xff0c;內存是很寶貴的&#xff0c;Redis的內存回收機制本質就是處理達到過期時間的key-value&#xff0c;以及當內存到達最大使用值時候觸發的內存淘汰策略。 Redis數據刪除的策略有哪些&#xf…

軟考重點題解析-基礎知識

1.加密技術&#xff1a;分為對稱加密技術&#xff1a;文件的加密和解密使用相同的密鑰 和 非對稱加密技術&#xff1a;加密和解密不同的密鑰&#xff0c;分別是公開密鑰和私有密鑰。 例題&#xff1a;若A,B兩人分別在認證機構&#xff08;CA&#xff09;M,N處獲得證書&…

項目準備March

Nginx主要用來作為Http服務器&#xff0c;要實現Tomcat的負載均衡&#xff0c;就可以通過Nginx來實現。 正向代理代理的是客戶端&#xff0c;反向代理代理的是服務端。SpringBoot采用約定優于配置的思想&#xff0c;簡化Spring項目的配置開發。 前端請求其實并未直接發送到后…

php連接hdfs初步探索

一、phdfs拓展 結果&#xff1a;暫時舍棄 安裝此拓展時&#xff0c;無法make成功&#xff0c;因為缺少hdfs.n文件。 換了其他版本的拓展包&#xff0c;并編譯都沒有找到此文件。 后搜到官網的相關資料&#xff0c;此hdfs.h的文件路徑的地址是$HADOOP_HDFS_HOME/include/hdfs…

數據增加

目錄 增加數據 實現數據增加&#xff0c;保存新的內容 注意 Oracle從入門到總裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 增加數據 由于 emp 表中的數據對日后的開發依然有用處&#xff0c;所以在講解更新之前 建議將emp 表數據做一個復制。將…

linux如何查看磁盤占用情況

要查看Linux系統中磁盤的占用情況&#xff0c;可以使用一些命令來獲取相關信息。以下是一些常用的命令&#xff1a; df命令&#xff1a; df命令用于顯示文件系統的磁盤空間使用情況&#xff0c;包括磁盤分區的總空間、已用空間、可用空間等信息。 df -h使用 -h 參數可以以人類可…

Golang 簡介與基本語法學習

Go&#xff0c;也被稱為 Golang&#xff0c;是一門由 Google 設計的開源編程語言。它旨在提供高效的開發體驗&#xff0c;同時具備并發性、內存安全和簡潔性。本篇博客將介紹 Golang 的基本語法和一些示例&#xff0c;幫助讀者快速入門這門令人著迷的語言。 簡介 Go 語言的設…

一個腳本兩步計算材料Raman譜(附數據處理和繪圖腳本)

在以往推送中已經介紹了相當多的計算材料Raman的方法&#xff0c;使用的軟件主要為Phonopy-Spectroscopy&#xff0c;相關軟件還有vasp&#xff0c;phonopy&#xff0c;phono3py等。 Phonopy-Spectroscopy計算材料紅外和Raman光譜 Phonopy-Spectroscopy 計算紅外和拉曼光譜 也…

經典面試題從瀏覽器輸入URL到頁面加載的過程?

從輸入URL到頁面加載的過程涉及多個步驟&#xff0c;包括DNS解析、TCP連接、發送HTTP請求、服務器處理請求、瀏覽器解析渲染頁面以及斷開連接。具體如下&#xff1a; DNS解析&#xff1a;當你在瀏覽器中輸入一個URL時&#xff0c;瀏覽器首先需要將域名轉換為IP地址。這個過程稱…

QT中提升為自定義控件的方法

一&#xff0e;介紹 提升為自定義的控件用法&#xff1a;先要寫好自定義控件后&#xff0c;再添加&#xff0c;在頻繁使用同一控件時&#xff0c;的確非常的高效。 同時導入別人開發的控件操作方法也類似。 二&#xff0e;下面以自定義的QPushButton作一個很簡單的例子&#x…

MongoDB聚合運算符:$bottomN

$bottomN聚合運算符返回分組中指定順序的最后n個元素&#xff0c;如果分組中的元素數量小于n&#xff0c;則返回分組的全部元素。從MongoDB5.2開始支持。 語法 {$bottomN:{n: <expression>,sortBy: { <field1>: <sort order>, <field2>: <sort or…

精品SSM的教學管理系統課程作業成績

《[含文檔PPT源碼等]精品基于SSM的教學管理系統[包運行成功]》該項目含有源碼、文檔、PPT、配套開發軟件、軟件安裝教程、項目發布教程、包運行成功&#xff01; 軟件開發環境及開發工具&#xff1a; Java——涉及技術&#xff1a; 前端使用技術&#xff1a;HTML5,CSS3、Jav…

esp32 C3和S3 開發板電流對比

出去好奇用合宙家的 lot power 測了兩塊開發板的運行電流。 esp32 S3 (嘉立創開發板 8N8 版本) 模式 電流downloa模式49 毫安空代碼91 毫安light mode27 毫安deep mode25 毫安delay 40 毫安 esp32 C3 無串口芯片 &#xff08;合宙 9.9 元版本&#xff09; 模式 …