深入浅出理解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 result
2.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 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 的方法,是:
- 创建包含 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提供了一个强大的工具集,用于处理实时数据分析和图数据查询。通过合理使用这些工具,我们可以构建高效、实时的数据处理系统。
深入浅出理解Continuous Queries和Cypher Query Language的更多相关文章
- 数据库系统概述(Data Model、DBMS、DBS、RDBS、Structured Query Language)
数据Data 描述事物的符号记录成为数据. 数据是数据库中存储的基本对象. 除了基本的数字之外.像图书的名称.价格.作者都可以称为数据. 将多种数据记录列成一张表.通过数据表管理数据. 每一行的数 ...
- InfluxDB学习之InfluxDB连续查询(Continuous Queries)
在上一篇:InfluxDB学习之InfluxDB数据保留策略(Retention Policies) 中,我们介绍了 InfluxDB的数据保留策略,数据超过保存策略里指定的时间之后,就会被删除. 但 ...
- hql(Hibernate Query Language)
1.Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate ...
- HQL: The Hibernate Query Language
Chapter 14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Ass ...
- 连续查询(Continuous Queries)
当数据超过保存策略里指定的时间之后,就会被删除.如果我们不想完全删除掉,比如做一个数据统计采样:把原先每秒的数据,存为每小时的数据,让数据占用的空间大大减少(以降低精度为代价). 这就需要Influx ...
- Hibernate Query Language查询:
Hibernate Query Language查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供 ...
- 数据库原理及应用-用户接口及SQL查询语言(Query Language)
2018-02-07 20:41:39 一.DBMS的用户接口 查询语言 访问DBMS的访问工具(GUI) API 相关类库 二.SQL语言 SQL语言可以细分为四种: 1.Data Definiti ...
- JVM Object Query Language (OQL) 查询语言
Object Query Language (OQL) OQL is SQL-like query language to query Java heap. OQL allows to filter/ ...
- Kibana Query Language(KQL)
语法: 官方文档 If you’re familiar with Kibana’s old lucene query syntax, you should feel right at home wit ...
- 深入浅出理解c++虚函数
深入浅出理解c++虚函数 记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数竟然不太确定,所以还是理解的不深刻,所以想通过这篇文章来巩固下. 装逼一刻: 最近,本人思想发 ...
随机推荐
- 【Amadeus原创】SQL Server查询某数据库所有表名行数和空间占用率
` select object_name(id) tablename, 8reserved/1024 reserved, rtrim(8dpages)+'kb' used, 8(reserved-dp ...
- MeteoInfo-Java解析与绘图教程(二)
MeteoInfo-Java解析与绘图教程(二) 上节说到了数据的简单解析,这节则说简单绘图 绘图的前置最重要的就是GridData,有了它,基本可以直接绘制出来 例如我们先放弃简单的自定义绘图的操作 ...
- git 基础操作 && 在"develop"分支修改动但不想提交切换到"master"分支(最后)
测试学习准备条件:一个目录,含不含有文件都可以,创建一个test.txt 1. 创建空仓库 git init 2. 修改过后,添加到本地仓库 添加指定的文件,如果一个以上,文件名空格隔开 git ad ...
- x509.MarshalSm2PrivateKey
根据搜索结果,x509.MarshalSm2PrivateKey 函数需要两个参数:一个 *sm2.PrivateKey 和一个 []byte 类型的密码.以下是使用 x509.MarshalSm2P ...
- Could not retrieve transation read-only status server 的解决办法
问题描述: 在项目开发的过程中,使用Hibernate的ORM进行建表时,出现 " Could not retrieve transation read-only status server ...
- Qt/C++开发经验小技巧296-300
使用QDir::setCurrent设置当前目录后,会影响程序中的所有相对目录的执行,导致可能的意外发生,一般相对目录都默认是可执行文件所在目录,所以如果程序中为了特殊处理临时调用了QDir::set ...
- Qt编写物联网管理平台32-表格数据
一.前言 用表格来展示采集到的数据,是很多组态系统中最常见的方法,一个表格能够展示的数据特别多,在本系统中,默认做的也是通过表格的形式来展示数据,目前是将所有的设备放在一个表格中,后期可能按照不同控制 ...
- Qt编写地图综合应用49-地图类型(街道图、卫星图)
一.前言 地图类型主要是两种,街道图和卫星图,平时我们看到的默认的都是街道图,无论是街道图还是卫星图,都是一张张图片文件组成的,级别越高,图片越是清晰,一般都会支持到19级的地图,相当于精确到20米内 ...
- [转]vue项目启动时,npm run serve 和 npm run dev 的区别
npm run serve 和 npm run dev 的区别 在我们运行一些 vue 项目的时候,输入npm run serve或者 npm run dev的其中一个时,系统会报错: PS C:\U ...
- IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)
本文由金蝶随手记技术团队丁同舟分享. 1.引言 跟移动端IM中追求数据传输效率.网络流量消耗等需求一样,随手记客户端与服务端交互的过程中,对部分数据的传输大小和效率也有较高的要求,普通的数据格式如 J ...