AGE agtype 简介

AGE 使用一种名为 agtype 的自定义数据类型,这是 AGE 返回的唯一数据类型。agtype 是 Json 的超集,也是 JsonB 的自定义实现。

简单数据类型

Null

在Cypher中,null用于表示缺失或未定义的值。概念上,null表示“缺失的未知值”,并且与其他值的处理方式略有不同。例如,从不具有该属性的顶点获取属性会产生null。大多数以null作为输入的表达式都会产生null。这包括在WHERE子句中用作谓词的布尔表达式。在这种情况下,任何不为true的内容都被解释为false。null不等于null。不知道两个值并不意味着它们是相同的值。因此,表达式null = null产生null而不是true。

输入/输出格式

SELECT *
FROM cypher('graph_name', $$RETURN NULL
$$) AS (null_result agtype);

null将显示为空格。

结果

null_result
(1行)

Agtype NULL与Postgres NULL

Agtype和Postgres中的NULL的概念与Cypher中的相同。

Integer

整数类型存储整数,即没有小数部分的数字。整数数据类型是一个64位字段,存储范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807的值。尝试存储超出此范围的值将导致错误。

输入/输出格式

SELECT *
FROM cypher('graph_name', $$RETURN 1
$$) AS (int_result agtype);

结果

int_result
1
(1行)

Float

浮点数据类型是一种不精确的、可变精度的数字类型,符合IEEE-754标准。

不精确意味着某些值无法精确地转换为内部格式,而是以近似值的形式存储,因此存储和检索值可能会出现轻微的差异。管理这些错误以及它们在计算中的传播是数学和计算机科学的一个整个分支的主题,这里不讨论这些内容,除了以下几点:

  • 如果需要精确的存储和计算(例如货币金额),应该使用numeric类型。
  • 如果要对这些类型进行复杂的计算,特别是在边界情况下(无穷大、下溢)依赖某些行为,应该仔细评估实现。
  • 对两个浮点数进行相等性比较可能不总是按预期工作。
  • 太大或太小的值将导致错误。如果输入数字的精度过高,则可能会进行舍入。接近零的数值,如果与零不可区分,将导致下溢错误。

除了普通的数值之外,浮点类型还具有几个特殊值:

  • 无穷大
  • 负无穷大
  • NaN

这些分别表示IEEE 754的特殊值“无穷大”、“负无穷大”和“非数字”。在Cypher命令中将这些值作为常量写入时,必须在它们周围加上引号并进行类型转换,例如

SET x.float_value = '-Infinity'::float

在输入时,这些字符串是以不区分大小写的方式识别的。

注意IEEE754规定NaN不应与任何其他浮点值(包括NaN)进行比较。然而,为了正确排序浮点数,AGE将'NaN'::float = 'NaN'::float评估为true。有关更多详细信息,请参阅“可比性和相等性”部分。

输入/输出格式

要使用浮点数,请表示为十进制值。

SELECT *
FROM cypher('graph_name', $$RETURN 1.0
$$) AS (float_result agtype);

结果

float_result
1.0
(1行)

Numeric

numeric类型可以存储非常大数量的数字。它特别推荐用于存储需要精确度的货币金额和其他数量。与可能的情况下,numeric值的计算会产生精确的结果,例如加法、减法、乘法。然而,与整数类型或浮点类型相比,numeric值的计算速度非常慢。

我们下面使用以下术语:numeric的精度是整数部分的有效数字总数,即小数点两侧的数字的数量。numeric的标度是小数点右侧的小数位数。因此,数字23.5141的精度为6,标度为4。整数可以视为具有标度为零。

未指定精度或标度将创建一个列,其中可以存储任意精度和标度的numeric值,最多达到精度的实现限制。这种类型的列不会强制输入值转换为任何特定的标度,而具有声明标度的numeric列将强制输入值转换为该标度。(SQL标准要求默认标度为0,即强制转换为整数精度。我们认为这有点无用。如果您关心可移植性,请始终明确指定精度和标度。)

注: 当在类型声明中明确指定精度时,允许的最大精度为1000;未指定精度的NUMERIC受到表8.2中描述的限制的约束。

如果要存储的值的标度大于列的声明标度,则系统将该值四舍五入到指定数量的小数位数。然后,如果小数点左侧的数字位数超过声明精度减去声明标度,则会引发错误。

numeric值在物理上存储时没有额外的前导零或尾随零。因此,列的声明精度和标度是最大值,而不是固定的分配。(在这个意义上,numeric类型更类似于varchar(n)而不是char(n)。)实际存储需求是每四个十进制数字组的两个字节,加上三到八个字节的开销。

除了普通的numeric值之外,numeric类型还允许特殊值NaN,表示“非数字”。对NaN进行的任何操作都会产生另一个NaN。在SQL命令中将该值作为常量写入时,必须将其用引号括起来,例如UPDATE table SET x = 'NaN'。

注: 在大多数“非数字”概念的实现中,NaN被认为不等于任何其他数值(包括NaN)。然而,为了允许浮点数正确排序,AGE将'NaN'::numeric = 'NaN'::numeric评估为true。有关更多详细信息,请参阅“可比性和相等性”部分。

在对值进行四舍五入时,numeric类型将值四舍五入到远离零的方向,而(在大多数计算机上)实数和双精度类型将值四舍五入到最近的偶数。例如:

输入/输出格式:

创建numeric数据类型时,需要使用::numeric数据注释。

查询

SELECT *
FROM cypher('graph_name', $$RETURN 1.0::numeric
$$) AS (numeric_result agtype);

结果:

numeric_result
1.0::numeric
(1 row)

Bool

AGE提供了标准Cypher类型布尔值。布尔类型可以有几种状态:“true”、“false”和第三种状态“unknown”,由Agtype null值表示。

布尔常量可以在Cypher查询中使用关键字TRUE、FALSE和NULL表示。

输入/输出格式

查询

SELECT *
FROM cypher('graph_name', $$RETURN TRUE
$$) AS (boolean_result agtype);

与Postgres不同,AGE的布尔输出为完整单词,即true和false,而不是t和f。

结果:

boolean_result
true
(1 row)

String


Agtype字符串 字符串文字可以包含以下转义序列:

Escape SequenceCharacter
\t制表符
\b退格
\n换行
\r回车
\f换页
\’单引号
\”双引号
\\Backslash
\uXXXXUnicode UTF-16 code point (4 hex digits must follow the \u)

输入/输出格式

使用单引号(‘)来标识字符串。输出将使用双引号(“)。

SELECT *
FROM cypher('graph_name', $$RETURN 'This is a string'
$$) AS (string_result agtype);

结果:

string_result
“This is a string”
(1 行)

复合数据类型

列表

所有示例将使用WITH子句和RETURN子句。

一般列表

通过使用方括号并用逗号分隔列表中的元素来创建文字列表。

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst
$$) AS (lst agtype);

结果:

lst
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
(1 行)

列表中的空值

列表可以包含空值,与空值独立时不同,它会以单词“null”出现在列表中。

查询

SELECT *
FROM cypher('graph_name', $$WITH [null] as lstRETURN lst
$$) AS (lst agtype);

结果:

lst
[null]
(1 行)

访问单个元素

要访问列表中的单个元素,我们再次使用方括号。这将从起始索引提取,但不包括结束索引。

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst[3]
$$) AS (element agtype);

结果:

element
3
(1 行)

在列表中映射元素

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, {key: 'key_value'}, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst
$$) AS (map_value agtype);

结果:

map_value
[0, {"key": "key_value"}, 2, 3, 4, 5, 6, 7, 8, 9, 10]
(1 行)

在列表中访问映射元素

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, {key: 'key_value'}, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst[1].key
$$) AS (map_value agtype);

结果:

map_value
“key_value”
(1 行)

负索引访问

您还可以使用负数,从列表的末尾开始。

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst[-3]
$$) AS (element agtype);

结果:

element
8
(1 行)

索引范围

最后,您可以在方括号内使用范围来返回列表的范围。

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst[0..3]
$$) AS (element agtype);

结果:

element
[0, 1, 2]
(1 行)

负索引范围

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst[0..-5]
$$) AS (lst agtype);

结果:

lst
[0, 1, 2, 3, 4, 5]
(1 行)

正切片

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst[..4]
$$) AS (lst agtype);

结果:

lst
[0, 1, 2, 3]
(1 行)

负切片

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst[-5..]
$$) AS (lst agtype);

结果:

lst
[6, 7, 8, 9, 10]
(1 行)

超出范围的切片会被简单地截断,但超出范围的单个元素会返回空值。

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst[15]
$$) AS (element agtype);

结果:

element
(1 行)

查询

SELECT *
FROM cypher('graph_name', $$WITH [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as lstRETURN lst[5..15]
$$) AS (element agtype);

结果:

element
[5, 6, 7, 8, 9, 10]
(1 行)

映射

映射可以使用Cypher构建。

带有简单数据类型的文字映射

您可以使用简单的agtypes构建简单映射

查询

SELECT *
FROM cypher('graph_name', $$WITH {int_key: 1, float_key: 1.0, numeric_key: 1::numeric, bool_key: true, string_key: 'Value'} as mRETURN m
$$) AS (m agtype);

结果:

m
{"int_key": 1, "bool_key": true, "float_key": 1.0, "string_key": "Value", "numeric_key": 1::numeric}
(1 行)

具有复合数据类型的字面映射

一个映射也可以包含复合数据类型,即列表和其他映射。

查询

SELECT *
FROM cypher('graph_name', $$WITH {listKey: [{inner: 'Map1'}, {inner: 'Map2'}], mapKey: {i: 0}} as mRETURN m
$$) AS (m agtype);

结果:

m
{"mapKey": {"i": 0}, "listKey": [{"inner": "Map1"}, {"inner": "Map2"}]}
(1 行)

映射的属性访问

查询

SELECT *
FROM cypher('graph_name', $$WITH {int_key: 1, float_key: 1.0, numeric_key: 1::numeric, bool_key: true, string_key: 'Value'} as mRETURN m.int_key
$$) AS (int_key agtype);

结果:

int_key
1
(1 行)

访问映射中的列表元素

查询

SELECT *
FROM cypher('graph_name', $$WITH {listKey: [{inner: 'Map1'}, {inner: 'Map2'}], mapKey: {i: 0}} as mRETURN m.listKey[0]
$$) AS (m agtype);

结果:

m
{"inner": "Map1"}
(1 行)


简单实体

实体具有唯一的、可比较的标识,该标识定义了两个实体是否相等。

实体被分配了一组属性,每个属性都由相应的属性键唯一标识。

图标识

简单实体被分配了一个唯一的图标识。图标识是实体标签ID和分配给每个标签的唯一序列的组合。请注意,当比较来自不同图形的实体时,ID会重叠。

标签

标签是将顶点和边分类到特定类别的标识符。

  • 边必须具有标签,但顶点不必。
  • 顶点和边之间的标签名称不能重叠。

有关如何使用标签创建实体的信息,请参阅CREATE子句。

属性

顶点和边都可以具有属性。属性是属性值,每个属性名称应仅定义为字符串类型。

顶点

  • 顶点是图的基本实体,具有能够独立存在的唯一属性。
  • 顶点可以被分配一个标签。
  • 顶点可以有零个或多个出边。
  • 顶点可以有零个或多个入边。

数据格式:

Attribute NameDescription
Id此顶点的图标识
label此顶点具有的标签名称
properties与此顶点关联的属性
{id:1; label: 'label_name'; properties: {prop1: value1, prop2: value2}}::vertex

将Map转换为顶点的类型转换

查询

SELECT *
FROM cypher('graph_name', $$WITH {id: 0, label: "label_name", properties: {i: 0}}::vertex as vRETURN v
$$) AS (v agtype);

结果

v
{"id": 0, "label": "label_name", "properties": {"i": 0}}::vertex
(1 row)

边是一个实体,编码了两个节点之间的有向连接,即源节点和目标节点。出边是从其源节点的视角来看的一个有向关系。入边是从其目标节点的视角来看的一个有向关系。一条边被分配一个边类型。

数据格式

属性名称描述
id此边的图标识
startid源节点的图标识
endid目标节点的图标识
label此边具有的标签名称
properties与此边关联的属性

输出:

{id: 3; startid: 1; endid: 2; label: 'edge_label' properties{prop1: value1, prop2: value2}}::edge

将Map转换为边的类型转换

查询

SELECT *
FROM cypher('graph_name', $$WITH {id: 2, start_id: 0, end_id: 1, label: "label_name", properties: {i: 0}}::edge as eRETURN e
$$) AS (e agtype);

结果:

v
{"id": 2, "label": "label_name", "end_id": 1, "start_id": 0, "properties": {"i": 0}}::edge
(1 row)

复合实体

路径

路径是一系列交替的顶点和边。路径必须以一个顶点开始,并至少有一条边。

将列表转换为路径的类型转换

查询

SELECT *
FROM cypher('graph_name', $$WITH [{id: 0, label: "label_name_1", properties: {i: 0}}::vertex,{id: 2, start_id: 0, end_id: 1, label: "edge_label", properties: {i: 0}}::edge,{id: 1, label: "label_name_2", properties: {}}::vertex]::path as pRETURN p
$$) AS (p agtype);

结果已格式化以提高可读性

p
[{"id": 0, "label": "label_name_1", "properties": {"i": 0}}::vertex, {"id": 2, "label": "edge_label", "end_id": 1, "start_id": 0, "properties": {"i": 0}}::edge,
{"id": 1, "label": "label_name_2", "properties": {}}::vertex]::path
(1 row)

 使用公有云服务

一些公有云的提供了免安装的数据库服务,无需自己部署。以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/bicheng/43989.shtml

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

相关文章

路径规划 | 基于蚁群算法的三维无人机航迹规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 基于蚁群算法的三维无人机航迹规划(Matlab)。 蚁群算法(Ant Colony Optimization,ACO)是一种模拟蚂蚁觅食行为的启发式算法。该算法通过模拟蚂蚁在寻找食物时…

【安全设备】Web应用防火墙

一、什么是Web应用防火墙 Web应用程序防火墙(Web Application Firewall)的缩写是WAF,用于保护Web应用程序免受各种恶意攻击和漏洞利用。WAF通过监控和过滤进出Web应用程序的HTTP/HTTPS流量来工作。它位于Web应用程序和用户之间,分…

【总线】AXI第九课时:介绍AXI响应信号 (Response Signaling):RRESP和 BRESP

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣,那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者,AXI4以其高性能和高度可扩展性,成为了现代电子系统中不可或缺的通信桥梁…

STM32F103RB多通道ADC转换功能实现(DMA)

目录 概述 1 硬件 1.1 硬件实物介绍 1.2 nucleo-f103rb 1.3 软件版本 2 软件实现 2.1 STM32Cube配置参数 2.2 项目代码 3 功能代码实现 3.1 ADC功能函数 3.2 函数调用 4 测试 4.1 DMA配置data width:byte 4.2 DMA配置data width:Half wor…

java如何实现一个死锁 ?

死锁(Deadlock)是指在并发系统中,两个或多个线程(或进程)因争夺资源而互相等待,导致它们都无法继续执行的一种状态。 一、简易代码 public class DeadlockExample {private static final Object lock1 = new Object();private

如何在 ASP.NET MVC 项目中使用身份验证器应用程序实现多因素身份验证?

介绍 增强安全性对于任何应用程序都至关重要,而多因素身份验证 (MFA) 是实现此目标的有效方法。在本文中,我们将介绍在 ASP.NET MVC 项目中使用身份验证器应用程序集成 MFA 的过程。无论您是从头开始还是将 MFA 添加到现有项目,本指南都将提…

生物素标记降钙素Biotin-α-CGRP, rat 中间体

生物素标记降钙素Biotin-α-CGRP, rat 中间体是一种特定的生物化学试剂,主要用于科学研究领域。以下是对该产品的详细介绍: 一、基本信息 产品名称:生物素标记降钙素Biotin-α-CGRP, rat 中间体 英文名称:Biotin-α-CGRP, rat 纯度…

Qt 线程同步机制 互斥锁 信号量 条件变量 读写锁

qt线程同步 Qt提供了丰富的线程同步机制来帮助开发者更高效和安全地进行多线程编程。其主要包括: QMutex:为共享数据提供互斥访问能力,避免同时写入导致的数据冲突。利用lock()/unlock()方法实现锁定和解锁。 QReadWriteLock:读写锁,允许多个读线程同时访问,但写操作需要独占…

springboot社区物资交易互助平台+lw+源码+调试+讲解

第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料,分析人员可以根据这些信息确定出本系统具备的功能,分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作,但…

windows USB 设备驱动开发-USB带宽

本文讨论如何仔细管理 USB 带宽的指导。 每个 USB 客户端驱动程序都有责任最大程度地减少其使用的 USB 带宽,并尽快将未使用的带宽返回到可用带宽池。 在这里,我们认为USB 2.0 的速度是480Mbps、12Mbps、1.5Mbps,这分别对应高速、全速、低速…

Python面试宝典第9题:买卖股票

题目 给定一个整型数组,它的第i个元素是一支给定股票第i天的价格。如果最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。 示例 1&#…

LabVIEW平台从离散光子到连续光子的光子计数技术

光子计数技术用于将输入光子数转换为离散脉冲。常见的光子计数器假设光子是离散到达的,记录到来的每一个光子。但是,当两个或多个光子同时到达时,计数器会将其记录为单个脉冲,从而只计数一次。当连续光子到达时,离散光…

python学习-容器类型

列表 列表(list)是一种有序容器,可以向其中添加或删除任意元素. 列表数据类型是一种容器类型,列表中可以存放不同数据类型的值,代码示例如下: 列表中可以实现元素的增、删、改、查。 示例代码如下: 增 …

基于Unity3D的Rokid AR Glass项目开发环境搭建

初识Rokid AR 一、SDK简介二、准备工作1.软件环境2.硬件环境 三、快速接入SDK1.配置Package Manager2.安装UXR2.0 SDK 四、导入官方Demo进行模拟器测试五、Rokid AR系列教程 一、SDK简介 UXR2.0 SDK是Rokid为Unity开发者提供的AR开发工具包,提供空间定位跟踪、双目…

Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)

netsh int ip reset 命令是用于重置 Windows 操作系统中的网络设置和配置的命令。 在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。 命令详解: netsh: 用于配置各种网络设置 int: 用于管理网络接口 ip: 用于管理网络接口的 IP 配…

学习嵌入式对于学历有要求吗?

学习嵌入式系统开发通常并不对学历有严格的要求,尤其是在技术行业中,实际的技能和经验往往比学历更为重要。我收集归类了一份嵌入式学习包,对于新手而言简直不要太棒,里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕…

Swift 中 map 和 flatMap 的区别 (入门版)

在 Swift 中,map 和 flatMap 是用于处理集合类型(如数组、字典、集合等)的两个重要方法。尽管它们看起来相似,但它们在处理集合中的元素和结果时有着不同的行为。 map 方法 map 方法会对集合中的每一个元素应用一个变换&#xff…

Ubuntu 24.04 LTS (Linux) 安装二维码生成工具 QRencode 二维码生成和识别

1 Ubuntu 安装 sudo apt update sudo apt-get install qrencode 2 查看版本 qrencode -V 3 生成二维码 qrencode -o test.png http://www.baidu.com 可以下载test.png图片,用手机浏览器扫描下看(⊙﹏⊙)

FPGA 项目菜单功能比较

为了帮助您更好地理解每个FPGA功能模块的实用场合、区别和特点,以下是详细的比较: 功能模块实用场合区别特点FPGA I/O自动控制系统、数据采集系统直接与FPGA板卡上的物理端口交互,配置和使用外部I/O设备灵活配置输入输出端口,支持…

Day62 单调栈part01

LC739每日温度(未掌握) 暴力解法:两层for循环,时间复杂度O(n^2),会超时未掌握原因分析:只想到了从栈顶到栈底是递减的情况,忽略了从栈顶到栈底是递增的情况 因为需要找到一个元素右边第一个更大元素,只有…