AGE已经对原始类型(布尔值、字符串、整数和浮点数)和映射的相等性有了良好的语义。此外,Cypher对整数、浮点数和字符串的可比性和可排序性也有很好的语义。然而,处理不同类型的值与Postgres定义的逻辑和openCypher规范存在偏差:
- 不同类型值之间的可比性已经定义。当作为谓词(在WHERE子句中)的评估的一部分时,这种偏差特别明显
- 如果传递给ORDER BY的值具有不同的类型,则不会导致失败。
底层概念模型复杂且有时不一致。这导致了比较运算符、相等性、分组和ORDER BY之间的关系不清晰:
- 可比性和可排序性一致地对齐,因为所有类型都可以被排序和比较。
- 在AGE中,通过IN、=、DISTINCT和分组暴露的相等性和等效性的区别仅限于将两个null值彼此测试为相等
- 在相等性中,null = null 是 null。
- 在等效性中,当分组值和使用DISTINCT时,两个null值始终被视为相同的值。
- 然而,如果null值是列表或映射值的元素,则相等性对待null值的方式会有所不同。
概念
openCypher规范涵盖了与相等性和排序相关的四个独特概念:
可比性
可比性由不等式运算符(>、<、>=、<=)使用,并定义了如何比较两个值的基本语义。
相等性
相等性由相等运算符(=、<>)和列表成员运算符(IN)使用。它定义了在这些情境下确定两个值是否相同的基本语义。相等性也被节点和关系模式中的字面地图隐式使用,因为这些字面地图仅仅是相等性谓词的简写表示。
可排序性
可排序性由ORDER BY子句使用,定义了如何对值进行排序的基本语义。
等价性
等价性由DISTINCT修饰符和投影子句(WITH、RETURN)中的分组使用,并定义了在这些情境中确定两个值是否相同的基本语义。
可比较性和等价性
比较运算符需要按照预期的方式进行比较运算 - 即等式和可比较性。但与此同时,它们还需要允许对列数据进行排序 - 即等价性和可排序性。
不幸的是,在同一查询中可能无法为等式和比较操作以及等价性和可排序性操作实现单独的比较运算符,而且在PostgreSQL中也无法实现。因此,我们将等价性和可排序性置于等式和可比较性之上,以便对输出数据进行排序。
可比较性
可比较性在任意一对值之间定义,如下所示。
- 数字
- 不同类型的数字(不包括NaN值和无穷大)按照数字在升序排列时,如果这两个数字被强制转换为任意精度的大十进制数(当前不属于Cypher类型系统),则它们将相互比较。
- 与不是数字的任何值的比较遵循可排序性的规则。
- 浮点数没有足够的精度来表示agtype整数和agtype数字范围内的所有整数。将整数或数字agtype转换为浮点数时,当转换值在高位和低位范围时,可能会产生意外的结果。
- 整数
- 整数按照数字在升序排列时进行数字比较。
- 浮点数
- 浮点数(不包括NaN值和无穷大)按照数字在升序排列时进行数字比较。
- 正无穷大的类型是FLOAT,它等于自身并且大于任何其他数字,除了NaN值。
- 负无穷大的类型是FLOAT,它等于自身并且小于任何其他数字。
- NaN值是可比较的,且大于任何其他浮点数值。
- 数字
- 数字按照数字在升序排列时进行数字比较。
- 布尔值
- 布尔值比较的结果是false小于true。
- 与不是布尔值的任何值的比较遵循可排序性的规则。
- 字符串
- 字符串按照字典顺序进行比较,即从字符串的开始到结束,逐对比较字符的升序排列。缺少在较短字符串中的字符被认为小于任何其他字符。例如,'a' < 'aa'。
- 与不是字符串的任何值的比较遵循可排序性的规则。
- 列表
- 列表按照顺序进行比较,即从列表的开始到结束,逐对比较列表元素的升序排列。在较短列表中缺少的元素被认为小于任何其他值(包括null值)。例如,[1] < [1, 0],但也有 [1] < [1, null]。
- 与不是列表的任何值的比较遵循可排序性的规则。
- 映射
- 映射的比较顺序未指定,由实现留待决定。
- 映射的比较顺序必须与下面概述的等式语义一致。因此,任何包含将其键映射到null值的条目的映射都是不可比较的。例如,{a: 1} <= {a: 1, b: null} 的计算结果为null。
- 与不是常规映射的任何值的比较遵循可排序性的规则。
实体
- 顶点
- 顶点的比较顺序基于分配的图形ID。
- 边
- 边的比较顺序基于分配的图形ID。
- 路径
- 路径被比较就好像它们是从起始节点到结束节点的路径的交替节点和关系的列表。例如,给定节点 n1、n2、n3,以及关系 r1 和 r2,并且假设 n1 < n2 < n3 和 r1 < r2,那么从 n1 经由 r1 到 n3 的路径 p1 将小于从 n2 经由 r2 到 n1 的路径 p2。
- 用列表表示:
p1 < p2
<=> [n1, r1, n3] < [n1, r2, n2]
<=> n1 < n1 || (n1 = n1 && [r1, n3] < [r2, n2])
<=> false || (true && [r1, n3] < [r2, n2])<=> [r1, n3] < [r2, n2]
<=> r1 < r2 || (r1 = r2 && n3 < n2)
<=> true || (false && false)
<=> true
* Comparison to any value that is not also a path will return false.
- null 与任何其他值(包括其他 null 值)都是不可比较的。
不同 Agtype 之间的可排序性
当使用 <、<=、>、>= 时,不同 Agtype 的排序从最小值到最大值为:
- 路径
- 边
- 顶点
- 对象
- 数组
- 字符串
- 布尔值
- 数字、整数、浮点数
- NULL
使用公有云服务
一些公有云的提供了免安装的数据库服务,无需自己部署。以MemFireCloud为例
直接连接
每个MemFire Cloud应用内置一个完整的Postgres数据库,你可以使用任何支持Postgres的工具来连接到数据库。你可以在控制台内的数据库设置中获取连接信息:
- 来到左侧菜单栏的
设置
部分 - 点击
数据库
- 启用数据库直连
- 找到应用的
连接信息
开启直连
白名单
MemFire Cloud内置白名单功能,开启白名单后,只允许白名单内的IP地址段访问你的数据库。关闭白名单后,访问你数据库的IP地址不受限制,即任何IP地址只要有连接信息都可以与你的数据库进行直连。 在进行白名单配置时,要遵循CIDR规则。MemFire Cloud中白名单功能 默认是关闭的,需用户手动开启。
配置白名单
通过数据库客户端连接数据库,可以执行图操作
CREATE EXTENSION age;
LOAD 'age';
SET search_path = ag_catalog, "$user", public;