深入淺出理解Continuous Queries和Cypher Query Language
1. 什么是Continuous Queries?
連續查詢是 Drasi 最重要的組件。它們是您告訴 Drasi 要在源系統中檢測哪些更改以及檢測到更改時要分發的數據的機制。源為訂閱的 Continuous Queries 提供源更改,然后為訂閱的 Reactions 提供查詢結果更改。

Continuous Queries(持續查詢)是一種特殊類型的查詢,它能夠持續監控數據變化并實時產生結果。與傳統的"一次性"查詢不同,持續查詢會在數據發生變化時自動更新結果。要了解它們的獨特之處,將它們與開發人員習慣于針對數據庫運行的那種即時查詢進行對比是很有用的。
當您執行瞬時查詢時,您正在某個時間點對數據庫運行查詢。數據庫計算查詢結果并返回這些結果。在處理這些結果時,您使用的是數據的靜態快照,并且不知道在運行查詢后數據可能發生的任何更改。如果您定期運行相同的瞬時查詢,則由于其他進程對數據所做的更改,每次的查詢結果可能會有所不同。但是要了解發生了什么變化,您需要將最近的結果與之前的結果進行比較。

Continuous Queries 一旦啟動,就會繼續運行,直到它們停止。在運行時,Continuous Queries 會保持永久準確的查詢結果,并在發生時合并對源數據庫所做的任何更改。Continuous Queries 不僅允許您請求查詢結果,就像在任何時間點一樣,而且當更改發生時,Continuous Query 會準確確定哪些結果元素已被添加、更新和刪除,并將更改的精確描述分發到訂閱 Continuous Query 的所有反應。
1.1 核心特征
- 實時性:持續監控數據變化,實時反映最新狀態
- 自動化:無需手動觸發,系統自動執行
- 效率高:只處理增量數據,避免全量掃描
- 資源友好:通過增量處理機制減少系統負載
2. Cypher Query Language簡介
Cypher是Neo4j圖數據庫的查詢語言,它的設計理念是"ASCII Art",即通過符號來形象地表達圖的結構和查詢模式。
2.1 基本語法結構
MATCH (node:Label {property: value})-[relationship:TYPE]->(otherNode)
WHERE condition
RETURN result2.2 核心概念
節點(Node):用圓括號表示,如:
()(user:User {name: 'John'})關系(Relationship):用方括號和箭頭表示,如:
-[]->(user)-[:FOLLOWS]->(friend)
屬性(Property):用花括號表示,如:
{key: value}{name: 'John', age: 30}
3. 實戰示例
3.1 簡單查詢
// 查找特定用戶
MATCH (u:User {name: 'John'})
RETURN u3.2 關系查詢
// 查找用戶關注關系 MATCH (u:User)-[:FOLLOWS]->(friend) RETURN u.name AS User, friend.name AS Following
3.3 復雜查詢示例
// 查找二度關系
MATCH (user:User {name: 'John'})-[:FOLLOWS*2]->(friendOfFriend)
RETURN DISTINCT friendOfFriend.name
// 查找共同好友
MATCH (user1:User {name: 'John'})-[:FOLLOWS]->(friend)<-[:FOLLOWS]-(user2:User {name: 'Alice'})
RETURN friend.name AS CommonFriends4. Continuous Queries最佳實踐
4.1 監控模式
// 監控新增用戶 MATCH (u:User) WHERE u.createTime > timestamp() - 86400000 // 最近24小時 RETURN u // 監控關系變化 MATCH (u1:User)-[r:FOLLOWS]->(u2:User) WHERE r.createTime > timestamp() - 3600000 // 最近1小時 RETURN u1.name, u2.name
5. 實際應用場景
5.1 社交網絡分析
// 發現影響力用戶 MATCH (u:User)<-[:FOLLOWS]-(follower) WITH u, COUNT(follower) as followers WHERE followers > 1000 RETURN u.name, followers ORDER BY followers DESC
5.2 推薦系統
// 基于共同興趣的推薦
MATCH (u1:User {name: 'John'})-[:INTERESTED_IN]->(topic)<-[:INTERESTED_IN]-(u2:User)
WHERE u1 <> u2
RETURN u2.name, COUNT(topic) as commonInterests
ORDER BY commonInterests DESC
LIMIT 56. 創建持續查詢
可以使用 Drasi CLI 創建和管理連續查詢。
創建 Continuous Query 的最簡單方法,以及您通常將 Continuous Query 作為更廣泛的軟件解決方案的一部分創建 Continuous Query 的方法,是:
- 創建包含 Continuous Query 定義的 YAML 文件。這可以存儲在您的解決方案存儲庫中,并與所有其他解決方案代碼/資源一起進行版本控制。
- 運行 drasi apply 以應用 YAML 文件,創建連續查詢
創建新的 Continuous Query 時,它會:
- 訂閱其 Sources,描述它想要接收的更改類型。
- 查詢其 Sources 以加載其查詢結果的初始數據。
- 開始處理來自其 Source 的 SourceChangeEvents 流,這些流表示已發生的低級別數據庫更改序列 (inserts、updated、deletes),并將它們轉換為對其查詢結果的更改。
以下是上例中使用的 Incident Alerting Continuous Query 定義的一個簡單示例:
apiVersion: v1
kind: ContinuousQuery
name: manager-incident-alert
spec:
sources:
subscriptions:
- id: human-resources
query: >
MATCH
(e:Employee)-[:ASSIGNED_TO]->(t:Team),
(m:Employee)-[:MANAGES]->(t:Team),
(e:Employee)-[:LOCATED_IN]->(:Building)-[:LOCATED_IN]->(r:Region),
(i:Incident {type:'environmental'})-[:OCCURS_IN]->(r:Region)
WHERE
elementId(e) <> elementId(m) AND i.severity IN [‘critical’, ‘extreme’] AND i.endTimeMs IS NULL
RETURN
m.name AS ManagerName, m.email AS ManagerEmail,
e.name AS EmployeeName, e.email AS EmployeeEmail,
r.name AS RegionName,
elementId(i) AS IncidentId, i.severity AS IncidentSeverity, i.description AS IncidentDescription
在此示例中,該屬性spec.sources.subscriptions標識 Source 的 id human-resources作為連續查詢的數據源。該屬性spec.query包含 Cypher 查詢的文本。有關連續查詢配置選項的完整詳細信息,請參閱 配置 部分。
如果此 Continuous Query 資源定義包含在名為 query.yaml 的文件中,要在當前 Kubectl 上下文的 Drasi 環境中創建此查詢,您可以運行以下命令:
drasi apply -f query.yaml
然后,您可以使用其他命令來查詢 Continuous Query 資源的存在和狀態。例如,要查看活動 Continuous Queries 的列表,請運行以下命令:drasi
drasi list query
要刪除活動的 Continuous Query,請運行以下命令:
drasi delete query <query-id>
例如,如果資源定義屬性中的連續查詢 ID 為namemanager-incident-alert ,您將運行
drasi delete query manager-incident-alert
注意: Drasi 目前不強制 Continuous Queries 和 Reactions 之間的依賴關系完整性。如果你刪除一個或多個 Reactions 使用的 Continuous Query,它們將停止獲取查詢結果更改。
總結
Continuous Queries結合Cypher Query Language提供了一個強大的工具集,用于處理實時數據分析和圖數據查詢。通過合理使用這些工具,我們可以構建高效、實時的數據處理系統。
歡迎大家掃描下面二維碼成為我的客戶,扶你上云

浙公網安備 33010602011771號