Neo4j(二) - 使用Cypher操作Neo4j

文章目錄

  • 前言
  • 一、Cypher簡介
  • 二、數據庫操作
    • 1. 創建數據庫
    • 2. 查看數據庫
    • 3. 刪除數據庫
    • 4. 切換數據庫
  • 三、節點、關系及屬性操作
    • 1. 創建節點與關系
      • 1.1 語法
      • 1.2 示例
    • 2. 查詢數據
      • 2.1 語法
      • 2.2 示例
    • 3. 更新數據
      • 3.1 語法
      • 3.2 示例
    • 4. 刪除節點與關系
      • 4.1 語法
      • 4.2 示例
    • 5. 合并數據
      • 5.1 語法
      • 5.2 示例


前言

本文將系統介紹 Cypher 的核心語法與操作邏輯,涵蓋數據庫管理、節點與關系的創建、查詢、更新及刪除等基礎操作,同時結合具體示例演示如何利用 Cypher 解決實際場景中的數據問題。通過理論與實踐的結合,幫助讀者快速掌握圖數據庫的核心操作范式,為進一步探索圖技術在大數據分析、人工智能等領域的應用奠定基礎。


一、Cypher簡介

Cypher 是一種聲明式圖數據庫查詢語言,由 Neo4j 公司開發,用于高效地查詢和更新圖數據庫中的數據。它使得開發者可以通過簡潔、直觀的語法來操作圖數據庫,而無需關心底層實現細節。Cypher 的設計目標是為了讓圖數據的操作變得簡單且強大,使非技術用戶也能輕松理解并使用。

Cypher 主要特點

  1. 模式匹配:Cypher 提供了強大的模式匹配能力,允許用戶通過圖形結構而非僅基于屬性或索引來查詢數據。
  2. 易于閱讀和編寫:其語法設計接近自然語言,尤其是對于那些具有圖形化思維的人來說更加直觀。
  3. 靈活的數據查詢與更新:無論是簡單的查詢還是復雜的圖形遍歷,Cypher 都能提供支持。
  4. 高效的執行計劃:Neo4j 會根據 Cypher 查詢自動生成高效的執行計劃,以確保快速的數據檢索速度。

使用場景

  • 社交網絡分析:利用 Cypher 可以很容易地找到人與人之間的關系網,比如朋友的朋友等。
  • 推薦系統:通過分析用戶的行為和偏好,為用戶提供個性化的產品或內容推薦。
  • 路徑查找:在運輸和物流行業,可以用來查找兩點之間的最優路徑。
  • 風險管理與欺詐檢測:通過分析實體間的關系,識別潛在的風險或欺詐行為。

Cypher 作為圖數據庫 Neo4j 的核心查詢語言,極大地簡化了圖數據的管理和分析過程,使得圖數據庫技術更易于被廣泛接受和應用。


二、數據庫操作

在 Neo4j 中,數據庫操作包括創建、查看和刪除數據庫等。不過需要注意的是,Neo4j 的社區版(Community Edition)通常只支持單個默認數據庫,即 neo4j 數據庫,并不支持創建多個數據庫。但是,從 Neo4j 4.0 版本開始,企業版支持多數據庫特性,允許用戶創建和管理多個數據庫實例。

1. 創建數據庫

要創建一個新的數據庫,可以使用以下 Cypher 命令。

CREATE DATABASE database_name

例如,如果你想創建一個名為 mydatabase 的新數據庫,你可以運行:

CREATE DATABASE mydatabase

注意:這個命令僅適用于 Neo4j 企業版。

2. 查看數據庫

查看當前系統中存在的所有數據庫,可以使用如下命令。

SHOW DATABASES

這將列出所有數據庫的信息,包括名稱、狀態(如在線或離線)、是否為主數據庫等。

在這里插入圖片描述

也可以使用如下命令查看可用數據庫。

:dbs

在這里插入圖片描述

3. 刪除數據庫

如果需要刪除一個數據庫,可以使用以下命令:

DROP DATABASE database_name

例如,刪除名為 mydatabase 的數據庫:

DROP DATABASE mydatabase

4. 切換數據庫

切換到數據庫neo4j

:use neo4j

在這里插入圖片描述


三、節點、關系及屬性操作

1. 創建節點與關系

在 Cypher 中,圖數據庫中的基本元素是 節點(Node)關系(Relationship)。使用 CREATE 命令可以創建節點和關系。

1.1 語法

創建節點的語法如下:

CREATE (variableName:Label {property1: value1, property2: value2, ...})
  • Label 是節點的標簽,用于分類。
  • {property1: value1} 是節點的屬性集合,可選。
  • variableName 是標簽變量,用于后續操作中引用該節點。

創建關系的語法如下:

CREATE (node1)-[relVariable:RELATIONSHIP_TYPE {prop: value}]->(node2)
  • relVariable 是關系變量。
  • RELATIONSHIP_TYPE 是關系類型,表示兩個節點之間的連接方式,關系類型是自定義的
  • 箭頭方向表示關系的方向(-> 表示從 node1 到 node2,<- 表示反向)。

1.2 示例

示例 1:創建一個簡單的節點

CREATE (a:Person {name: 'Alice', age: 30})
  • 這個命令創建了一個帶有 Person 標簽的節點,并賦予它兩個屬性:nameage
  • 節點變量為 a,可以在后續查詢中引用這個節點。

在這里插入圖片描述

示例 2:創建兩個節點并建立關系

// 創建第一個節點 Alice
CREATE (a:Person {name: 'Alice'})
// 創建第二個節點 Bob
CREATE (b:Person {name: 'Bob'})
// 在 Alice 和 Bob 之間創建 FRIENDS_WITH 關系
CREATE (a)-[r:FRIENDS_WITH {since: 2020}]->(b)
  • 這組命令首先創建了兩個 Person 節點,分別代表 Alice 和 Bob。
  • 然后在這兩個節點之間創建了一個類型為 FRIENDS_WITH 的關系,并設置了關系屬性 since,表示他們成為朋友的時間是 2020 年。
  • 關系變量為 r,可以用于進一步操作或查詢這條關系。

在這里插入圖片描述

示例 3:在一個命令中創建節點和關系

CREATE (a:Person {name: 'Alice'})-[:WORKS_AT]->(b:Company {name: 'Tech Corp'})
  • 此命令同時創建了兩個節點(一個 Person 節點和一個 Company 節點)以及它們之間的 WORKS_AT 關系。
  • 注意這里沒有給關系指定變量,這意味著我們不能直接引用這條關系進行后續操作,除非再次通過查詢找到它。

在這里插入圖片描述

示例 4:使用已存在的節點創建關系

MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[r:COLLEAGUE_OF {department: 'Engineering'}]->(b)
  • 首先通過 MATCH 查找數據庫中名為 Alice 和 Bob 的節點。
  • 然后在找到的這兩個節點之間創建了一個 COLLEAGUE_OF 類型的關系,并添加了一個 department 屬性說明他們在同一個部門工作。
  • 給關系指定了變量 r,方便之后對這條關系進行修改或查詢。

在這里插入圖片描述

示例 5:創建雙向關系
雖然在 Cypher 中默認定義的關系是有方向性的,但可以通過創建兩條相反方向的關系來模擬雙向關系:

MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[:KNOWS]->(b)
CREATE (b)-[:KNOWS]->(a)
  • 這段代碼創建了兩個 KNOWS 關系,一條從 Alice 到 Bob,另一條從 Bob 到 Alice,從而實現了雙向關系的效果。

在這里插入圖片描述

2. 查詢數據

在 Neo4j 中,MATCH 是用于查詢圖數據的核心命令。它通過模式匹配(Pattern Matching) 來查找符合特定結構的節點、關系及其屬性。

2.1 語法

基本語法結構如下:

MATCH (variable1:Label1 {property1: value1})
RETURN variable1
  • (variable1:Label1 {property1: value1}):表示一個帶有標簽和屬性的節點。
  • RETURN:指定你想返回的數據內容。

匹配帶關系的結構語法如下:

MATCH (variable1:Label1)-[:RELATIONSHIP_TYPE]->(variable2:Label2)
RETURN variable1, variable2
  • -[:RELATIONSHIP_TYPE]->:表示兩個節點之間的關系,方向可變(-><-)。
  • RELATIONSHIP_TYPE:是你定義的關系類型,如 KNOWS, WORKS_AT 等。

使用 WHERE 進行過濾語法如下:

MATCH (n:Person)
WHERE n.age > 30
RETURN n.name
  • WHERE 子句用于添加條件過濾查詢結果。

2.2 示例

示例 1:查詢所有 Person 節點

MATCH (p:Person)
RETURN p

在這里插入圖片描述

示例 2:查詢具有特定屬性的節點
查找名字為 Alice 的 Person 節點。

MATCH (p:Person {name: 'Alice'})
RETURN p

在這里插入圖片描述

示例 3:查詢節點和其關系
查找 Alice 所認識的所有人,并返回 Alice、KNOWS 關系以及對方節點。

MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person)
RETURN a, r, b

在這里插入圖片描述

示例 4:僅返回某些字段或屬性
只返回 Person 節點的 name 和 age 屬性。

MATCH (p:Person)
RETURN p.name, p.age

在這里插入圖片描述

示例 5:使用 WHERE 過濾年齡大于 30 的人
查找并返回年齡大于 20 的人。

MATCH (p:Person)
WHERE p.age > 20
RETURN p.name, p.age

在這里插入圖片描述

示例 6:查找雙向關系(比如互為好友)

MATCH (a:Person {name: 'Alice'})-[r1:KNOWS]->(b:Person {name: 'Bob'})
MATCH (b)-[r2:KNOWS]->(a)
RETURN a, r1, b, r2

在這里插入圖片描述

示例 7:模糊匹配多個關系類型
查找 Alice 認識或一起工作的人。

MATCH (a:Person {name: 'Alice'})-[:KNOWS|WORKS_WITH]->(b)
RETURN b.name

在這里插入圖片描述

示例 8:限制返回數量
最多只返回 3 個 Person 的名字。

MATCH (p:Person)
RETURN p.name
LIMIT 3

在這里插入圖片描述

跳過 1 個查詢結果并最多返回 3 個 Person 的名字。

MATCH (p:Person)
RETURN p.name
LIMIT 3

在這里插入圖片描述

3. 更新數據

在 Neo4j 中,使用 Cypher 可以方便地更新圖數據庫中的節點(Node)和關系(Relationship)的屬性值;可以使用 SETREMOVE 等命令進行更新操作。

3.1 語法

更新節點屬性的語法如下:

MATCH (n:Label {property: value})
SET n.propertyName = newValue
RETURN n
  • MATCH:查找要更新的節點。
  • SET:設置或修改某個屬性的值。
  • RETURN:返回更新后的結果(可選)。

刪除屬性或標簽語法如下:

MATCH (n:Person {name: 'Alice'})
REMOVE n.age
RETURN n
  • REMOVE 命令可以刪除節點或關系的屬性或標簽。

更新關系屬性語法如下:

MATCH ()-[r:RELATIONSHIP_TYPE]->()
SET r.newProperty = 'value'
RETURN r

3.2 示例

示例 1:更新節點的屬性

將名為 Alice 的 Person 節點的年齡改為 31 歲。

MATCH (n:Person {name: 'Alice'})
SET n.age = 31
RETURN n

在這里插入圖片描述

示例 2:添加新的屬性

為名為 Bob 的 Person 添加一個新屬性 email

MATCH (n:Person {name: 'Bob'})
SET n.email = 'bob@example.com'
RETURN n

在這里插入圖片描述

示例 3:一次性設置多個屬性

可以在一條 SET 語句中同時設置多個屬性。

MATCH (n:Person {name: 'Bob'})
SET n.age = 45, n.city = 'Shanghai', n.job = 'Engineer'
RETURN n

在這里插入圖片描述

示例 4:刪除節點的某個屬性

刪除名為 Alice 的 Person 的 age 屬性。

MATCH (n:Person {name: 'Alice'})
REMOVE n.age
RETURN n

在這里插入圖片描述

示例 5:刪除節點的標簽

將名為 Bob 的 Person 節點的標簽從 Person 改為 User

MATCH (n:Person {name: 'Bob'})
REMOVE n:Person
SET n:User
RETURN n

?? 注意:Neo4j 不支持直接重命名標簽,只能通過先移除再添加的方式來“更改”標簽。

在這里插入圖片描述

示例 6:更新關系屬性

更新Alice和Bob的 KNOWS 關系的 since 屬性。

MATCH (:Person {name: 'Alice'})-[r:KNOWS]->(:User {name: 'Bob'})
SET r.since = 2021
RETURN r

在這里插入圖片描述

4. 刪除節點與關系

在 Neo4j 中,刪除圖數據庫中的 節點(Node)關系(Relationship) 是常見的操作。Cypher 提供了 DELETEDETACH DELETE 等命令來完成這些任務。

由于 Neo4j 的圖結構特性:一個節點不能有未刪除的關系存在,因此在刪除節點前必須先刪除它關聯的所有關系,否則會報錯。

4.1 語法

刪除關系的語法如下:

MATCH ()-[r:RELATIONSHIP_TYPE]->()
DELETE r
  • 使用 MATCH 找到要刪除的關系。
  • 使用 DELETE 刪除匹配到的關系。

刪除節點的語法(需先刪除關系)如下:

MATCH (n:Label {property: value})
DELETE n

?? 如果該節點還有關系存在,將拋出錯誤。

推薦方式:使用 DETACH DELETE

MATCH (n:Label {property: value})
DETACH DELETE n
  • DETACH DELETE 會自動刪除節點及其所有關聯的關系,無需手動先刪除關系。
  • 這是最安全、最常用的刪除節點的方式。

4.2 示例

示例 1:刪除兩個特定節點之間的關系

刪除 Alice 和 Bob 之間的 KNOWS 關系。

MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'})
DELETE r

在這里插入圖片描述

示例 2:刪除特定類型的關系

刪除所有的 KNOWS 類型關系。

MATCH ()-[r:KNOWS]->()
DELETE r

在這里插入圖片描述

示例 3:刪除某個特定節點(先刪除關系)

刪除名為 Alice 的 Person 節點及其所有關系。

MATCH (n:Person {name: 'Alice'})
DETACH DELETE n

在這里插入圖片描述

示例 4:刪除沒有關系的孤立節點

刪除“孤立”的節點(即沒有關系連接的節點)。

MATCH (n)
WHERE NOT EXISTS((n)--())
DELETE n

在這里插入圖片描述

示例 5:刪除所有節點和關系(清空整個圖數據庫)

刪除數據庫中所有的節點和它們的關系。

MATCH (n)
DETACH DELETE n

在這里插入圖片描述

5. 合并數據

合并數據用于創建或更新節點或關系,不存在則創建,存在則更新。為了避免數據重復插入,可以使用 MERGE 替代 CREATE

在 Neo4j 中,MERGE 是一個非常強大的命令,它用于確保某個圖模式存在。如果該模式不存在,則會創建它;如果已經存在,則不會執行任何操作(也可以選擇更新某些屬性)。這非常適合用來避免重復插入相同的數據。

5.1 語法

基本語法如下:

MERGE (n:Label {uniqueProperty: value})
SET n.otherProperty = otherValue
RETURN n
  • MERGE:嘗試匹配指定的模式(節點或關系)。
  • 如果沒有找到匹配項,則創建新的節點或關系。
  • 可以結合 ON CREATE SETON MATCH SET 來分別設置創建時和匹配到時的操作。

使用 ON CREATE 和 ON MATCH 的完整語法:

MERGE (n:Label {uniqueProperty: value})
ON CREATE SET n.created = timestamp()
ON MATCH SET n.lastAccessed = timestamp()
RETURN n
  • ON CREATE SET:僅當節點是新創建的時候才執行。
  • ON MATCH SET:僅當節點已存在時才執行。

5.2 示例

示例 1:確保某節點存在(若不存在則創建)

MERGE (p:Person {name: 'Alice'})
RETURN p

如果數據庫中沒有名為 Alice 的 Person 節點,則創建一個;如果有,則返回已存在的節點。

在這里插入圖片描述

示例 2:確保節點存在,并設置額外屬性

MERGE (p:Person {name: 'Bob'})
SET p.age = 30
RETURN p

確保 Bob 存在,并將他的年齡設為 30。如果 Bob 已經存在,則覆蓋其 age 屬性。

在這里插入圖片描述

示例 3:使用 ON CREATE 和 ON MATCH 區分創建與更新操作

MERGE (p:Person {name: 'Charlie'})
ON CREATE SET p.created = datetime()
ON MATCH SET p.lastSeen = datetime()
RETURN p
  • 如果 Charlie 是第一次出現,則設置 created 時間;
  • 如果已存在,則更新 lastSeen 時間。

在這里插入圖片描述

示例 4:合并關系(確保兩個節點之間有某種關系)

MERGE (a:Person {name: 'Alice'})
MERGE (b:Person {name: 'Bob'})
MERGE (a)-[r:FRIENDS_WITH]->(b)
RETURN a, r, b

確保 Alice 和 Bob 存在,并且他們之間有一條 FRIENDS_WITH 關系。如果已經存在這條關系,則不重復創建。

在這里插入圖片描述

示例 5:合并帶屬性的關系

MERGE (a:Person {name: 'Alice'})
MERGE (b:Person {name: 'Bob'})
MERGE (a)-[r:WORKS_WITH {since: 2022}]->(b)
RETURN r

確保 Alice 和 Bob 之間有一條 WORKS_WITH 類型的關系,并帶有屬性 since: 2022

在這里插入圖片描述

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

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

相關文章

RabbitMQ的Web管理頁面給我看懵了,這都什么意思啊

文章目錄 OverviewTotalsMessage RatesQueued Messages NodesChurn StatisticsPorts and ContextsExport DefinitionsImport Definitions ConnectionsChannelsExchangesQueuesAdmin他們之間的關聯 在上一篇文章中我們講到了如何在Windows中安裝Rabbitmq&#xff0c; 小白也能搞…

安全基礎與協議分析

5.1 Web安全基礎 5.1.1 Web安全基礎概覽&#xff08;一、二&#xff09; Web安全的核心目標是保護Web應用及其數據免受攻擊&#xff0c;涵蓋以下關鍵領域&#xff1a; 攻擊面&#xff1a; 前端漏洞&#xff08;XSS、CSRF&#xff09;。 后端漏洞&#xff08;SQL注入、RCE&a…

STM32項目實戰:ADC采集

STM32F103C8T6的ADC配置。PB0對應的是ADC1的通道8。在標準庫中&#xff0c;需要初始化ADC&#xff0c;設置通道&#xff0c;時鐘&#xff0c;轉換模式等。需要配置GPIOB的第0腳為模擬輸入模式&#xff0c;然后配置ADC1的通道8&#xff0c;設置轉換周期和觸發方式。 接下來是I2C…

第十四章:數據治理之數據源:數據源的數據接入、業務屬性梳理及監控

本章開始&#xff0c;將進入9大模塊的介紹。第一個模塊我們先介紹&#xff1a;數據源。數據源是整個數據中臺數據的來源&#xff0c;是一個起點。更好的管理好數據源這個起點&#xff0c;是數據治理的一個好的開始。 在【數據&#xff1a;業務生數據&#xff0c;數據生“萬物”…

【C/C++】多線程開發:wait、sleep、yield全解析

文章目錄 多線程開發&#xff1a;wait、sleep、yield全解析1 What簡要介紹詳細介紹wait() — 條件等待&#xff08;用于線程同步&#xff09;sleep() — 睡覺&#xff0c;定時掛起yield() — 自愿讓出 CPU 2 區別以及建議區別應用場景建議 3 三者協作使用示例 多線程開發&#…

阿里云CDN刷新預熱--刷新URL

文章目錄 一、全英文URL刷新預熱二、摻雜中文的URL刷新預熱2.1 對帶中文URL進行編碼2.2 預熱刷新 三、CDN刷新-核心作用與價值3.1 核心作用3.2 核心價值3.3 典型使用場景 *最后我想說&#xff1a;請你不要相信我說的每一句話&#xff0c;這只是我的個人經驗* 一、全英文URL刷新…

Oracle 19c DG備庫報錯ORA-00313、ORA-00312、ORA-27037

Oracle 19c DG備庫報錯ORA-00313、ORA-00312、ORA-27037 錯誤排查問題處理錯誤排查 DG同步完成后,DG Broker show database發現以下告警信息: Database Warning(s):ORA-16826: apply service state is inconsistent with the DelayMins propertyORA-16789: standby redo log…

開源與閉源之爭:AI時代的創新博弈與未來抉擇

在人工智能技術狂飆突進的今天&#xff0c;開源與閉源之爭已不再局限于技術圈的討論&#xff0c;而是演變為一場關乎技術倫理、商業格局乃至人類文明走向的深度博弈。當Meta的Llama 3開源模型下載量突破百萬&#xff0c;當OpenAI的GPT-5繼續加固技術壁壘&#xff0c;這場沒有硝…

NIFI的處理器:JSLTTransformJSON 2.4.0

該處理器使用JSLT轉換FlowFile JSON有效負載的格式。使用轉換后的內容創建新的FlowFile&#xff0c;并將其路由到“成功”關系。如果JSLT轉換失敗&#xff0c;則將原始FlowFile路由到“失敗”關系。 需要注意的是&#xff0c;編譯JSLT轉換可能相當昂貴。理想情況下&#xff0c…

MySQL 索引失效及其解決辦法

一、前言 在數據庫優化中,索引(Index)是一項至關重要的技術手段,可以顯著提升查詢性能。然而,在實際開發過程中,MySQL 索引并不總是如預期生效。本文將從原理出發,系統地介紹索引失效的常見場景及其解決方案,幫助開發者有效規避性能陷阱。 二、索引基礎回顧 MySQL 支…

趨勢觸發策略

趨勢觸發策略(TS版)是一種基于TrendTriggerFactor(TTF)的交易策略,通過柱狀圖顏色變化指示市場趨勢的強度,并根據TTF的穿越信號進行買賣操作。 TTF是通過計算買方力量和賣方力量的差值除以兩者之和的一半再乘以100得到的。 當TTF大于100時,柱狀圖顯示為綠色,表示市場…

DeepSeek-R1 模型現已在亞馬遜云科技上推出

亞馬遜云科技提供眾多免費云產品&#xff0c;可以訪問&#xff1a;亞馬遜云科技 在剛剛過去的 Amazon re&#xff1a;Invent 期間&#xff0c;Amazon 首席執行官 Andy Jassy 分享了從 Amazon 自己在全公司開發近 1000 個生成式 AI 應用程序的經驗中汲取的寶貴經驗。從這種廣泛…

中臺項目-微前端qiankun-umimax

學習視頻&#x1f50a; 基礎&#xff1a; 黑馬前端基于qiankun搭建微前端項目實戰教程_嗶哩嗶哩_bilibili 路由、部署配置注意&#xff1a;qiankunvite微前端上線注意事項&#xff0c;base公共路徑設置_嗶哩嗶哩_bilibili 微前端 什么是微前端&#xff1f; 微前端是將前端應…

【Java學習筆記】代碼塊

代碼塊 介紹&#xff1a;代碼塊又稱為初始化塊&#xff0c;屬于類中的成員&#xff08;即是類的一部分&#xff09;&#xff0c;類似于方法&#xff0c;將邏輯語句封裝在方法體中&#xff0c;通過{}包圍起來 與類方法的不同點 無方法名 無返回類型 無參數 只有方法體&#…

spring boot 2.7集成舊的springfox-boot-starter swagger oas 3.0

舊版本目前已經不維護推薦使用 springdoc-openapi-ui&#xff0c;這里為了演示使用舊的最新依賴 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dep…

Linux按鍵驅動測試方式詳細介紹

Linux按鍵驅動測試可采用以下分層方法&#xff1a; 基礎事件檢測 使用輸入子系統調試工具&#xff1a; sudo apt install evtest # 安裝事件測試工具 evtest # 選擇對應設備編號觸發按鍵后觀察終端輸出&#xff0c;正常情況應顯示&#xff1a; Event:…

USB學習【13】STM32+USB接收數據過程詳解

目錄 1.官方的描述2.HAL的流程把接收到的數據從PMA拷貝到用戶自己定義的空間中 3.處理接收到的數據4.最后再次開啟準備接收工作 1.官方的描述 2.HAL的流程 以上的官方說法我們暫時按下不表。 如果接收到數據&#xff0c;會激活中斷進入到USB_LP_CAN1_RX0_IRQHandler&#xff0…

上海內推 | 上海算法創新研究院-上海交大聯合招收空間智能/具身智能算法實習生

最近這一兩周不少公司已開啟春招和實習招聘。 不同以往的是&#xff0c;當前職場環境已不再是那個雙向奔赴時代了。求職者在變多&#xff0c;HC 在變少&#xff0c;崗位要求還更高了。 最近&#xff0c;我們又陸續整理了很多大廠的面試題&#xff0c;幫助一些球友解惑答疑&am…

C語言速成12之指針:程序如何在內存迷宮里找寶藏?

程序員Feri一名12年的程序員,做過開發帶過團隊創過業,擅長Java、鴻蒙、嵌入式、人工智能等開發,專注于程序員成長的那點兒事,希望在成長的路上有你相伴&#xff01;君志所向,一往無前&#xff01; 0. 前言&#xff1a;程序如何在內存迷宮里找寶藏&#xff1f; 想象內存是一個巨…

部署n8n

https://github.com/n8n-io/n8n docker volume create n8n_data docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n Discover 2192 Automation Workflows from the n8ns Community