深入浅出理解Continuous Queries和Cypher Query Language

news/2025/2/21 20:10:09/文章来源:https://www.cnblogs.com/shanyou/p/18719289

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 result

2.2 核心概念

  1. 节点(Node):用圆括号表示,如:()

    (user:User {name: 'John'})
  2. 关系(Relationship):用方括号和箭头表示,如:-[]->

    (user)-[:FOLLOWS]->(friend)
  3. 属性(Property):用花括号表示,如:{key: value}

    {name: 'John', age: 30}

3. 实战示例

3.1 简单查询

// 查找特定用户
MATCH (u:User {name: 'John'})
RETURN u

3.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 CommonFriends

4. 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 5

6.  创建持续查询

可以使用 Drasi CLI 创建和管理连续查询。

创建 Continuous Query 的最简单方法,以及您通常将 Continuous Query 作为更广泛的软件解决方案的一部分创建 Continuous Query 的方法,是:

  1. 创建包含 Continuous Query 定义的 YAML 文件。这可以存储在您的解决方案存储库中,并与所有其他解决方案代码/资源一起进行版本控制。
  2. 运行 drasi apply 以应用 YAML 文件,创建连续查询

创建新的 Continuous Query 时,它会:

  1. 订阅其 Sources,描述它想要接收的更改类型。
  2. 查询其 Sources 以加载其查询结果的初始数据。
  3. 开始处理来自其 Source 的 SourceChangeEvents 流,这些流表示已发生的低级别数据库更改序列 (inserts、updated、deletes),并将它们转换为对其查询结果的更改。

以下是上例中使用的 Incident Alerting Continuous Query 定义的一个简单示例:

apiVersion: v1
kind: ContinuousQuery
name: manager-incident-alert
spec:sources:    subscriptions:- id: human-resourcesquery: > 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) WHEREelementId(e) <> elementId(m) AND i.severity IN [‘critical’, ‘extreme’] AND i.endTimeMs IS NULLRETURN 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提供了一个强大的工具集,用于处理实时数据分析和图数据查询。通过合理使用这些工具,我们可以构建高效、实时的数据处理系统。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bronco CTF Write Up 题解

Bronco CTF Write Up 目录Bronco CTF Write UpBeginnerBreak the BattalionSimon SaysToo Many EmojisCryptoAcross the TracksRahhh-SAWebGrandmas Secret RecipeReverseReversing for Ophidiophilestheflagishere!ForensicsQR Coded Beginner Break the Battalion这道题我们会…

我用DeepSeek找到了视频号流量密码,摊牌了!

两娃的爸创业中,公众号“绘个球”(回复1)实时分享创业动态,提供地理、军事类3D动画工具。流量初战告捷 先上流量效果,图从左至右分别为小红书、快手、视频号。对于一个短视频新手,算得上惊喜。如果是一条可长期复制的流量赛道,运营的事就水到渠成。接下来我会知无不尽地说…

Trivy : 容器漏洞扫描器

介绍 安装 扫描 Git 存储库 扫描容器镜像 扫描文件系统 扫描正在运行的容器 在 Dockerfile 中嵌入 Trivy介绍 Trivy 是aqua security开发的一款开源工具,用于扫描漏洞和配置错误。该工具可在多个层面发挥作用:它可以评估基础设施即代码、检查容器镜像、提供配置文件帮助、分析…

2024.2.16 鲜花

逆元详解逆元(详细揭秘)雑踏、僕らの街 やり残した鼓動がこの夜を覆って 僕らを包んで 粉々になる前に 頼りなくてもいい その手を この手は自分自身のものさ 変わらないはずはないよ 手を伸ばして 雑踏の中で声無き声で泣いている 足跡が今 誰かの声を消した朝 いつになって…

国内开源镜像站点汇总

还在为访问国外网站速度慢如蜗牛而烦恼吗?还在为下载大型开源项目耗时过长而焦虑吗?今天就为大家介绍一个神器:国内开源镜像站点! 什么是镜像站? 简单来说,镜像站就是将国外网站的内容(包括软件、文档、代码等)复制到国内服务器上,用户访问国内镜像站就相当于访问国外…

【shell脚本】实现DDOS攻击自动封禁IP

需求: 请根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP。防火墙命令为: iptables-I INPUT -s IP地址 -j DROP脚本实现: #!/bin/bash ############################################################# # File Nam…

ollama国内下载慢的问题

梯子挂好, 走代理 🙂 vim ~/.zshrc# 添加 # proxy v2 export http_proxy="http://127.0.0.1:10809" export ftp_proxy="http://127.0.0.1:10809" export https_proxy="http://127.0.0.1:10809" export all_proxy="http://127.0.0.1:1080…

日语

1.want to do sth 想做某事 I want to go to school. 我想去上学。want sb to do sth 想让某人做某事 I want my son to go to school.我想让我的儿子去上学。be different from 与......不同 The weather in Beijing is different from that of Nanjing.北京的天气和南京的不同…

02 内联 new delete

内联 函数调用流程: 程序执行顺序转移到函数所存放的内存中某个地址,将函数的程序内容执行完后,再返回到调用函数前的地方。要达到这样的目的必须在转去前,保护现场并存储执行的地址,转回后先恢复现场,并按照原存储地址继续执行。因此,函数调用有一定的时间和空间方面的…

08_基本数据类型介绍(测试发布文章)

08_基本数据类型介绍输入(问题):基本数据类型介绍?正例:输出(答案):知识描述:Java 数据类型分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。注意事项:引用数据类型的大小统一为 4 个字节,记录的是其引用对象的地址! 本章…

【CodeForces训练记录】Codeforces Round 1005 (Div. 2)

训练情况赛后反思 D题应该可以开出来的,看出了异或的性质,不等式可以移项,感觉是后缀异或+二分 A题 自己手玩一下就发现了,遇到首位1需要全部后缀移动到下面,再把首位0移动到上面,这样重复,所以我们从第一次出现 1 开始记录答案,操作次数为 01 交界处数量 + 1,另外特判…

DeepSeek-R1-671B 大模型本地部署详细教程

DeepSeek-R1大模型具备深度思考和推理能力,在数学、代码、自然语言推理等任务上都有着极大的提升。一方面由于官方或第三方的在线服务或多或少存在不稳定的问题,另一方面考虑到数据安全和隐私问题,本地私有化部署DeepSeek开源大模型对个人或企业来说也是一种不错的选择。本文…