Apache AGE 聚合函数

简介

一般来说,聚合函数 aggr(expr) 会处理每个聚合键在传入记录中找到的所有匹配行(键使用等价性进行比较)。

在常规聚合(即形式为 aggr(expr) 的情况下),聚合值列表是候选值列表,其中所有空值都被移除。

初始数据

sqlCopy code
SELECT * FROM cypher('graph_name', $$CREATE (a:Person {name: 'A', age: 13}),(b:Person {name: 'B', age: 33, eyes: "blue"}),(c:Person {name: 'C', age: 44, eyes: "blue"}),(d1:Person {name: 'D', eyes: "brown"}),(d2:Person {name: 'D'}),(a)-[:KNOWS]->(b),(a)-[:KNOWS]->(c),(a)-[:KNOWS]->(d1),(b)-[:KNOWS]->(d2),(c)-[:KNOWS]->(d2)
$$) as (a agtype);

自动分组

为了计算聚合数据,Cypher 提供了与 SQL 的 GROUP BY 相类似的聚合功能。

聚合函数接受一组值并计算它们的聚合值。例如,avg() 计算多个数值的平均值,或者 min() 在一组值中找到最小的数值或字符串值。当我们说下面一个聚合函数在一组值上操作时,我们指的是这些值是对相同聚合组内所有记录应用内部表达式(例如 n.age)的结果。

聚合可以在所有匹配的子图上计算,也可以通过引入分组键进一步分割。这些是非聚合表达式,用于对进入聚合函数的值进行分组。

假设我们有以下返回语句:

sqlCopy code
SELECT * FROM cypher('graph_name', $$MATCH (v:Person)RETURN v.name, count(*)
$$) as (grouping_key agtype, count agtype);

我们有两个返回表达式:grouping_key 和 count()。第一个 grouping_key 不是一个聚合函数,因此它将成为分组键。后者 count() 是一个聚合表达式。匹配的子图将被划分为不同的桶,具体取决于分组键。然后将在这些桶上运行聚合函数,为每个桶计算一个聚合值。

在聚合函数上进行排序

要使用聚合函数对结果集进行排序,聚合必须包含在 RETURN 中以便在 ORDER BY 中使用。

sqlCopy code
SELECT *
FROM cypher('graph_name', $$MATCH (me:Person)-[]->(friend:Person)RETURN count(friend), meORDER BY count(friend)
$$) as (friends agtype, me agtype);

唯一聚合

在唯一聚合(即形式为 aggr(DISTINCT expr) 的情况下),聚合值列表是候选值列表,其中所有空值都被移除。此外,在唯一聚合中,只有所有等价候选值中的一个被包含在聚合值列表中,即等价性下的重复项被移除。

DISTINCT 操作符与聚合一起使用。它用于使所有值在通过聚合函数之前变得唯一。

sqlCopy code
SELECT *
FROM cypher('graph_name', $$MATCH (v:Person)RETURN count(DISTINCT v.eyes), count(v.eyes)
$$) as (distinct_eyes agtype, eyes agtype);

模糊的分组语句

不要求用户为查询指定其分组键的这个特性可能导致 Cypher 应将什么视为其分组键的模糊性。点击此处了解更多详细信息。

数据设置

sqlCopy code
SELECT * FROM cypher('graph_name', $$
CREATE (:L {a: 1, b: 2, c: 3}),(:L {a: 2, b: 3, c: 1}),(:L {a: 3, b: 1, c: 2})
$$) as (a agtype);

在 AGE 中的无效查询

AGE 对这个问题的解决方案是不允许 WITH 或 RETURN 列结合不在相同 WITH 或 RETURN 子句的另一列中明确列出的变量与聚合函数相结合。

查询:

sqlCopy code
SELECT * FROM cypher('graph_name', $$MATCH (x:L)RETURN x.a + count(*) + x.b + count(*) + x.c
$$) as (a agtype);

结果:

sqlCopy code
ERROR:  "x" must be either part of an explicitly listed key or used inside an aggregate function
LINE 3: RETURN x.a + count(*) + x.b + count(*) + x.c

AGE 中的有效查询

在 AGE 中不包括聚合函数的列被视为该 WITH 或 RETURN 子句的分组键。

对于上述查询,用户可以以多种方式重写查询以返回结果。

查询:

sqlCopy code
SELECT * FROM cypher('graph_name', $$MATCH (x:L)RETURN (x.a + x.b + x.c) + count(*) + count(*), x.a + x.b + x.c
$$) as (count agtype, key agtype);

x.a + x.b + x.c 是分组键。这样创建的分组键必须包含括号。

结果

sqlCopy code
count	key
12	6
1 row

查询

sqlCopy code
SELECT * FROM cypher('graph_name', $$MATCH (x:L)RETURN x.a + count(*) + x.b + count(*) + x.c, x.a, x.b, x.c
$$) as (count agtype, a agtype, b agtype, c agtype);

x.a、x.b 和 x.c 将被视为不同的分组键

结果:

sqlCopy code
abc
count			
8	3	1	2
8	2	3	1
8	1	2	3
3 rows

在模糊分组中的顶点和边

或者,分组键可以是一个顶点或边,然后可以指定顶点或边的任何属性,而不需要在 WITH 或 RETURN 列中明确声明。

sqlCopy code
SELECT * FROM cypher('graph_name', $$MATCH (x:L)RETURN count(*) + count(*) + x.a + x.b + x.c, x
$$) as (count agtype, key agtype);

结果将根据 x 分组,因为可以安全地假设属性被视为分组不明确。

结果

sqlCopy code
key
count	
8	{"id": 1407374883553283, "label": "L", "properties": {"a": 3, "b": 1, "c": 2}}::vertex
8	{"id": 1407374883553281, "label": "L", "properties": {"a": 1, "b": 2, "c": 3}}::vertex
8	{"id": 1407374883553282, "label": "L", "properties": {"a": 2, "b": 3, "c": 1}}::vertex
3 rows

隐藏不想要的分组键

如果认为分组键对查询输出无关紧要,则可以在 WITH 子句中进行聚合,然后将信息传递给 RETURN 子句。

sqlCopy code
SELECT * FROM cypher('graph_name', $$MATCH (x:L)WITH count(*) + count(*) + x.a + x.b + x.c as column, xRETURN column
$$) as (a agtype);

结果

sqlCopy code
a
8
8
8
3 rows 

 使用公有云服务

一些公有云的提供了免安装的数据库服务,无需自己部署。以MemFireCloud为例

直接连接

每个MemFire Cloud应用内置一个完整的Postgres数据库,你可以使用任何支持Postgres的工具来连接到数据库。你可以在控制台内的数据库设置中获取连接信息:

  1. 来到左侧菜单栏的 设置部分
  2. 点击数据库
  3. 启用数据库直连
  4. 找到应用的连接信息

开启直连

白名单

MemFire Cloud内置白名单功能,开启白名单后,只允许白名单内的IP地址段访问你的数据库。关闭白名单后,访问你数据库的IP地址不受限制,即任何IP地址只要有连接信息都可以与你的数据库进行直连。 在进行白名单配置时,要遵循CIDR规则。MemFire Cloud中白名单功能 默认是关闭的,需用户手动开启。

配置白名单

通过数据库客户端连接数据库,可以执行图操作

CREATE EXTENSION age;
LOAD 'age';
SET search_path = ag_catalog, "$user", public;

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

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

相关文章

Clion 使用gdbserver调试FreeSWITCH源码

1.准备环境 window安装clion安装好gdb、ssh、已经编译好的freeswitch可执行文件的docker镜像2.配置clion Settings -> Tools ->SSH Configurations Settings-Build, Execution, Deployment-Toolchains(其实设不设置都行,用默认也行的) Settings-Build, Execution, Depl…

DockerCompose拉取DockerHub镜像,并部署OpenMetaData

参考博主:http://t.csdnimg.cn/i49ET 一、DockerCompose拉取DockerHub镜像 方法一(不太行): 在daemon.json文件中添加一些国内还在服务的镜像站(可能某些镜像会没有) ([ -f /etc/docker/daemon.json ] ||…

人工智能大模型如何助力电商产品经理打造高效的商品工业属性画像

摘要 商品工业属性画像是电商产品经理在进行商品管理、推荐、搜索、广告等业务时的重要依据。通过对商品的工业属性(如品类、品牌、规格、功能、风格等)的准确识别和标注,可以提高商品的展示效果、匹配度、转化率和用户满意度。然而&#xf…

从概念到完成:Midjourney——设计思维与AI技术的完美结合

文章目录 本文来自 Python学研大本营 作者 学研君 去年 AI 爆火的时候,学研君也赶时髦用上了 Midjourney。平时用它生成图片,感觉生成的图片好看,比上网四处找图更省时省事,更合心意,还不用担心版权问题。 给大家看一下…

102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程

自定义实现的Table控件,支持跨qt版本,兼容qt5,qt6! 截图如下所示: 黑色风格如下所示: 视频演示入口:Qt QML QianWindowV2.5(新增曲线综合示例、QML最全Table交互示例、支持qt5/qt6)_哔哩哔哩_bilibili 1.示例页面入口…

【单片机毕业设计选题24061】-基于蓝牙的单片机通信系统

系统功能: 1、本系统硬件由两块STM32单片机,DHT11,光敏传感器,12864oled和HC-05蓝牙模块组成。 2、单片机1HC-05蓝牙模块做为主机,单片机2HC-05蓝牙模块做为从机。 3、单片机从机将采集到温湿度,光照强度等信息通过…

使用mybatis的statementHander拦截器监控表和字段并发送钉钉消息

新建mybatis的statementHander拦截器拦截器 类 面试题&#xff1a; 2.实现 解析Sql时引入JSqlParser JSqlParser 是一个 SQL 语句解析器。 它将 SQL转换为可遍历的 Java 类层次结构。 <dependency><groupId>com.github.jsqlparser</groupId><artifac…

[IDEA插件] JarEditor 编辑jar包(直接新增、修改、删除jar包内的class文件)

文章目录 1. 安装插件 JarEditor2. 在IDEA中添加外部JAR包3. JarEditor 使用介绍 之前我们需要修改jar内文件的时候需要解压jar包&#xff0c;反编译class&#xff0c;新建java源文件&#xff0c;修改代码&#xff0c;再编译成class&#xff0c;替换jar包内的class文件。 现在…

数据库作业5---视图

创建表 创建部门表&#xff08;dept&#xff09;和员工表&#xff08;emp&#xff09; create table dept(dept_id int primary key auto_increment comment 部门编号,dept_name char(20) comment 部门名称);insert into dept(dept_name) values(销售部),(财务部),(生产部),(…

Day03-索引模板,DSL语句,集群迁移API,ES集群状态统计API,KQL语句及分片重路由API实战

Day03-索引模板&#xff0c;DSL语句&#xff0c;集群迁移API&#xff0c;ES集群状态统计API&#xff0c;KQL语句及分片重路由API实战 1、索引模板1.1 什么是索引模板1.2 查看索引模板1.3 创建/修改索引模板1.4 删除索引模板 2、ES的DSL语句查询2.1 什么是DSL2.2 全文检索-match…

tusimple车道线检测 标注自己的数据集

一、打开labelme工具进行数据标注 二、数据格式转换 2.1 标签转换 运行Anaconda Prompt&#xff0c;进入json标签文件所在目录&#xff0c;逐个转换&#xff0c;分布运行 labelme_json_to_dataset 0000.json labelme_json_to_dataset 0001.json labelme_json_to_dataset 000…

redis查询慢,你们是如何查询优化?(运维篇3)

1、查看是否写入了bigkey 如果你查询慢日志发现&#xff0c;并不是复杂度过高的命令导致的&#xff0c;而都是 SET / DEL 这种简单命令出现在慢日志中&#xff0c;那么你就要怀疑你的实例否写入了 bigkey。 Redis 在写入数据时&#xff0c;需要为新的数据分配内存&#xff0c;相…

2024年公共文化与社会服务国际会议(ICPCSS 2024)

2024年公共文化与社会服务国际会议 2024 International Conference on Public Culture and Social Services 【1】会议简介 2024年公共文化与社会服务国际会议是一个集学术性、实践性和国际性于一体的盛会。我们期待与您共同探讨公共文化与社会服务的未来发展方向&#xff0c;为…

【linux】服务器设置所有用户创建虚拟环境到默认路径

【linux】服务器设置所有用户创建虚拟环境到默认路径 【创作不易&#xff0c;点点赞关注收藏】&#x1f600; 需要安装anaconda3的小伙伴可以看一下我前面的博文linux安装anaconda3 一、情况说明 我的anaconda3安装在"/public/apps/anaconda3/“&#xff0c;我希望所有…

C#实现最短路径算法

创建点集 double r 200 * 500;double width 1920;double height 1080;int col (int)(r / width);int row (int)(r / height);List<(double, double)> list1 new List<(double, double)>();for (int i 0; i < row; i){var y i * height;if (y < r){va…

好莱坞级别AI视频工具Odyssey亮相!AI世界动态回顾

好莱坞级别的视觉AI&#xff1a;Odyssey 首先&#xff0c;我们要提到的就是Odyssey——一款新晋AI视频工具&#xff0c;它以其好莱坞级别的视觉AI能力引起了广泛关注。奥德赛展示的一些片段令人印象深刻&#xff0c;包括精美的无人机镜头、风景画面以及专业级的B-roll素材。虽…

Snap Video:用于文本到视频合成的扩展时空变换器

图像生成模型的质量和多功能性的显著提升&#xff0c;研究界开始将其应用于视频生成领域。但是视频内容高度冗余&#xff0c;直接将图像模型技术应用于视频生成可能会降低运动的保真度和视觉质量&#xff0c;并影响可扩展性。来自 Snap 的研究团队及其合作者提出了 "Snap …

运算放大器(2)

&#xff08;1&#xff09;反向放大器 Vout(-R2/R1)*Vi 图一运放的同向端接地0V&#xff0c;反向端和同向端虚短&#xff0c;所以也是0V 反向输入端输入电阻很高&#xff0c;虚断&#xff0c;几乎没有电流注入和流出&#xff0c;那么R1和R2相当于是串联的&#xff0c;流过一个…

Nacos服务公网环境登陆报密码错误问题排查

作者&#xff1a;小丫 一、问题现象 nacos服务内网可以正常登录&#xff0c;如下&#xff1a; 走公网代理出来之后&#xff0c;无法正常登录&#xff0c;报错"用户名密码错误" 二、排查步骤 1、链路分析 首先确认公网代理的链路&#xff1a; 域名—>haprox…

Epson打印机日常问题和解决办法

1、打印过程中缺纸&#xff0c;重新放入纸张之后&#xff0c;打印机出错。 打开“控制面板”&#xff0c;进入“设备与打印机”&#xff1a; 选择你正在使用的打印机&#xff0c;最下面可以看到打印机状态&#xff08;我这边用完脱机了&#xff0c;所以显示脱机&#xff09;&a…