AGE在基礎資料類型(布爾值、字串、整數和浮點數)和映射中已經具有良好的相等性語義。另外,Cypher對整數、浮點數和字串在各自類型內的可比較性和有序性也具有良好的語義。
然而,處理不同類型值時的行為偏離了Postgres的定義邏輯和openCypher規範:
不同類型值之間的可比較性是已定義的。這種偏離在作為謂詞評估(在WHERE中)的一部分時尤為明顯。
ORDER BY不會因為傳遞的值具有不同的類型而失敗。
底層的概念性模型複雜且有時不一致。這導致比較子、相等性、分組和ORDER BY之間的關係不清楚:
可比較性和有序性是一致對齊的,因為所有類型都可以被排序和比較。
相等性和等價性的區別,由
IN、=、DISTINCT和分組暴露出來,在AGE中僅限於測試兩個值為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。與非普通映射的值進行比較時,遵循可排序性的規則。
實體
頂點
頂點的比較順序基於分配的
graphid。
邊
邊的比較順序基於分配的
graphid。
路徑
路徑的比較方式如同它們是從起始節點到結束節點的路徑中交替的節點和關係的列表。例如,給定節點
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說明與非路徑的值進行比較時,返回
false。
NULL
null與任何其他值(包括其他null值)都不可比較。
不同Agtype之間的可排序性
在使用<、<=、>、>=對不同Agtype進行排序時,從最小值到最大值的順序為:
Path
Edge
Vertex
Object
Array
String
Bool
Numeric, Integer, Float
NULL
以上順序在未來的版本中可能會發生變化。