すべてのプロダクト
Search
ドキュメントセンター

PolarDB:同等性、平等、秩序性と同等性

最終更新日:Jan 23, 2025

AGEは、プリミティブ型 (ブール、文字列、整数、および浮動小数点) とマップ内の等式のための優れたセマンティクスを提供します。 さらに、Cypherは、各型内の整数、フロート、および文字列の比較可能性と順序可能性の優れたセマンティクスを提供します。

ただし、さまざまな型の値を扱うことは、PostgresおよびopenCypher仕様で定義されているロジックから逸脱しています。

  • 異なるタイプの値間の比較が定義される。 この偏差は、述語の評価の一部として発生する場合に特に顕著です (WHERE) 。

  • ORDER BYに渡された値が異なる型の場合、ORDER BYは失敗しません。

基礎となる概念モデルは複雑で、一貫性がない場合があります。 これにより、比較演算子、等式、グループ化、およびORDER BYの間の関係が不明確になります。

  • すべてのタイプを注文して比較できるため、比較可能性と注文可能性は一貫して互いに調整されます。

  • IN=DISTINCT、およびAGEのグループ化で公開されているように、同等性と同等性の違いは、値がnullである2つのインスタンスが等しいかどうかをテストすることに限定されます。

    • 等式では、null = nullnullです。

    • 同等に、DISTINCTおよびグループ化値で使用される場合、2つのnull値は常に同じ値と見なされます。

    • null値がリストまたはマップ値の要素である場合、equalityはnull値を異なる方法で扱います。

コンセプト

openCypher仕様は、平等と順序付けに関連する4つの異なる概念を備えています。

比較可能性

比較可能性は、不等式演算子 (> 、<、>=、<=) によって使用され、2つの値を比較する方法の基礎となるセマンティクスを定義します。

平等

Equalityは、等式演算子 (=、<>) とリストメンバーシップ演算子 (IN) によって使用されます。 これらのコンテキストで2つの値が同じかどうかを判断するために、基礎となるセマンティクスを定義します。 平等は、ノードおよびリレーショナルパターンのリテラルマッピングにも暗黙的に使用されます。このようなリテラルマッピングは、等式述語の省略形にすぎないためです。

注文可能性

OrderabilityはORDER by句で使用され、値の順序付け方法の基礎となるセマンティクスを定義します。

同等性

等価性は、DISTINCT修飾子および射影句 (WITHおよびRETURN) でグループ化することによって使用され、これらのコンテキストで2つの値が同じかどうかを判断するための基礎となるセマンティクスを定義します。

比較可能性と平等

比較演算子は、同等性と比較可能性で期待どおりに機能する必要があります。 同時に、列データのソートを可能にし、同等性と順序性を確保する必要があります。

残念ながら、同じクエリに対して、PostgreSQLにおいて、等価演算および比較演算、ならびに等価演算および順序性演算のための別個の比較演算子を実装することは可能でない場合がある。 したがって、等価性および順序性は、出力データの順序付けを可能にするために、等価性および比較性よりも優先される。

比較可能性

比較可能性は、以下に指定されるように、値の任意のペア間で定義される。

  • 数値

    • 異なるタイプの数 (NaN値と無限大を除く) は、昇順で互いに数値的に比較する前に、両方の数が任意の精度の大きな小数 (現在はCypherタイプシステム外) に強制されているかのように互いに比較されます。

    • 数値でもない値との比較は、順序性の規則に従います。

    • 浮動小数点数には、agtype整数とagtype数値の範囲内のすべての整数を表すのに必要な精度がありません。 整数または数値のagtypeを浮動小数点数にキャストする場合、高い範囲と低い範囲の値をキャストすると、予期しない結果が発生する可能性があります。

    • 整数

      • 整数は昇順で数値的に比較されます。

    • 浮動小数点数

      • 浮動小数点数 (NaN値と無限大を除く) は、昇順で数値的に比較されます。

      • 正の無限大はFLOAT型であり、それ自体に等しく、NaN値を除く他の任意の数よりも大きい。

      • 負の無限大はFLOATタイプで、それ自体に等しく、他のどの数よりも小さいです。

      • NaN値は、互いに同等であり、任意の他の浮動小数点数よりも大きい。

    • 数値

      • 数値は昇順で数値的に比較されます。

  • ブーリアン

    • ブールは次のルールで比較されます。falsetrue未満です。

    • ブール値でもない値との比較は、順序性の規則に従います。

  • 文字列

    • 文字列は辞書の順序で比較されます。つまり、文字は文字列の先頭から末尾まで昇順でペアで比較されます。 短い文字列で欠落している文字は、他のどの文字よりも少ないと見なされます。 たとえば、「a」 <「aa」です。

    • 文字列でもない値との比較は、順序性の規則に従います。

  • リスト

    • リストは順番に比較されます。つまり、リストの要素はリストの先頭から末尾まで昇順でペアで比較されます。 短いリストにない要素は、他の値 (null値を含む) よりも小さいと見なされます。 たとえば、[1] < [1,0] だけでなく、[1] < [1, null] のようになります。

    • リストでもない値との比較は、順序性の規則に従います。

  • マップ

    • マップの比較順序は指定されておらず、実装に委ねられています。

    • マップの比較順序は、以下に概説する等価セマンティクスと一致する必要があります。 したがって、キーをnull値にマップするエントリを含むマップは、比較できません。 たとえば、{a: 1} <= {a: 1, b: null}nullを返します。

    • 通常のマップでもない値との比較は、順序性の規則に従います。

エンティティ

  • 頂点

    • 頂点の比較順序は、割り当てられたgraphidに基づいています。

  • エッジ

    • エッジの比較順序は、割り当てられたグラファイトに基づいています。

  • Paths

    • パスは、それらが交互のノードのリストであるかのように、および開始ノードから終了ノードまでのパスの関係であるかのように比較される。 たとえば、ノードn1n2、および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の順序は、最小値から最大値までです。

  1. パス

  2. Edge

  3. Vertex

  4. オブジェクト

  5. 配列

  6. String

  7. Bool

  8. 数値、整数、フロート

  9. NULL

説明

これは、将来のリリースで変更される可能性があります。