MLEのJavaScriptでのVECTORデータ型のサポート

Oracle Multilingual Engine (MLE)では、JavaScript TypedArraysとSQLベクトルの間のINT8FLOAT32およびFLOAT64形式の変換がサポートされています。JavaScriptデータ型とVECTORデータ型間のデータ交換は、MLE JavaScript SQLドライバ、MLEコール仕様およびMLE JavaScriptバインディングによってサポートされます。

VECTORデータ型は、INOUTおよびIN OUTバインド引数、および戻り型として指定できます。MLEコール仕様のSIGNATURE句では、次のJavaScript型がサポートされます。

  • Float32Array
  • Float64Array
  • Int8Array
  • SparseVector

表A-5 VECTORデータ型からJavaScript型へのマッピング

SQL型 JavaScript型
VECTOR(*, float32) Float32Array (TypedArray)
VECTOR(*, float64) Float64Array (TypedArray)
VECTOR(*, int8) Int8Array (TypedArray)
VECTOR(*) Float64Array脚注1(TypedArray)
VECTOR(*, float32, SPARSE) SparseVector脚注2

脚注1 ベクトル形式または記憶域形式が指定されていない場合、デフォルトで密Float64Arrayが使用されます

脚注2 記憶域形式が指定されていない場合、デフォルトで密形式が使用されます。スパース・ベクトルの形式は、入力の形式(FLOAT32、FLOAT64またはINT8)によって決まります。

表A-6 JavaScript型からVECTORデータ型へのマッピング

JavaScript型 SQL型
Float32Array VECTOR(*, float32)
Float64Array VECTOR(*, float64)
Int8Array VECTOR(*, int8)
Array VECTOR(*, float64)
SparseVector VECTOR(*, [float32 | float64 | int8], SPARSE)脚注3

脚注3 SQLのスパース・ベクトルの形式は、ファンクション・シグネチャで指定された形式によって異なります。

指定しないかぎり、ベクトルの記憶域形式はデフォルトでDENSEになります。これは、ゼロ値を含むベクトルのすべてのディメンションが物理的に格納されることを意味します。SPARSEベクトルは、ほとんどのディメンションがゼロであり、ゼロ以外の値のみが物理的に格納されるベクトルです。ほぼ完全にゼロ値のディメンションで構成されるベクトルがある場合、スパース・ベクトルを使用すると、パフォーマンスが向上し、記憶域要件が削減されます。

データベース内JavaScriptでは、スパース(および密)ベクトルは、データベースに挿入してMLEからフェッチでき、INOUTおよびINOUTファンクションの引数として使用され、MLEコール仕様のシグネチャで指定できます。JavaScriptでは、スパース・ベクトルは、次のプロパティを持つSparseVectorオブジェクトを使用して表されます。

  • numDimensions: ゼロ値およびゼロ以外の値を含むベクトルのディメンションの数。
  • indices: ゼロ以外の値を持つディメンションの索引(ゼロベース)を含む配列。
  • values: 指定された索引のディメンションのゼロ以外の値を含む配列。

dense()メソッドを使用して、SparseVectorオブジェクトを密ベクトルに変換できます。dense()SparseVectorで使用すると、Oracle AI Databaseのスパース・ベクトル列のゼロ以外の値の記憶域形式に応じて、8ビット整数、32ビット浮動小数点数または64ビット浮動小数点数のTypedArrayが返されます。

SparseVectorオブジェクトは、次の方法で定義できます。
  • ディメンション数、ゼロ以外の値の場所を表す索引の配列、および値の配列を含むJSON配列の形式の文字列として:
    oracledb.SparseVector('[10, [1, 3, 5], [1.5, 3.5, 7.7]]')
  • 値の配列、ゼロ以外の値の場所を表す索引の配列、およびディメンションの数を含むオブジェクトとして:
    oracledb.SparseVector({values: [1.5, 3.5, 7.7], indices: [1, 3, 5], numDimensions: 10})
  • 密配列(JavaScript配列またはTypedArray)として:
    oracledb.SparseVector([0, 1.5, 0, 3.5, 0, 7.7, 0, 0, 0, 0])

関連項目:

例A-1 MLEでのVECTORデータ型の使用

この例では、引数で使用されるVECTORデータ型と、MLEコール仕様の戻り型のサポートを示します。

SET SERVEROUTPUT ON;
CREATE OR REPLACE MLE MODULE vec_mod
LANGUAGE JAVASCRIPT AS

/**
 * Add two vectors
 * @param v1 the first vector
 * @param v2 the second vector
 * @returns the resulting vector after adding v1 and v2
 */
export function addVectors(v1, v2){
  return v1.map((element, index) => element + v2[index]);
}

/**
 * Subtract two vectors
 * @param v1 the first vector
 * @param v2 the second vector
 * @returns the resulting vector after subtracting v2 from v1
 */
export function subtractVectors(v1, v2){
  return v1.map((element, index) => element - v2[index]);
}
/

CREATE OR REPLACE PACKAGE mle_vec_pkg AS

  FUNCTION addVectors(
    input_vector1 IN VECTOR,
    input_vector2 IN VECTOR
  )
  RETURN VECTOR
    AS MLE MODULE vec_mod
    SIGNATURE 'addVectors';

  FUNCTION subtractVectors(
    input_vector1 IN VECTOR,
    input_vector2 IN VECTOR
  )
  RETURN VECTOR
    AS MLE MODULE vec_mod
    SIGNATURE 'subtractVectors';

END mle_vec_pkg;
/
SELECT mle_vec_pkg.addVectors(
  VECTOR('[1, 2]'),
  VECTOR('[3, 4]')
) AS result;

結果:

RESULT
---------------------------------------------
[4.0E+000,6.0E+000]
SELECT mle_vec_pkg.subtractVectors(
  VECTOR('[3, 4]'),
  VECTOR('[1, 2]')
) AS result;

結果:

RESULT
---------------------------------------------
[2.0E+000,2.0E+000]

例A-2 MLEでのスパース・ベクトルの使用

CREATE OR REPLACE MLE MODULE my_sparse_mod
LANGUAGE JAVASCRIPT AS

    /**
     * print out the dimensions of a sparse vector input by first 
     * calling the sparseVector constructor over the input argument 
     * and then by changing the JavaScript object to a JSON string
     * @param {vector} input - a vector with dimension values to be printed
     */

    export function printSparseVec(input) {
        const sparseVec = oracledb.SparseVector(input);
        const sparseVal = JSON.stringify(sparseVec);
        console.log(sparseVal);
    }
/

CREATE OR REPLACE PROCEDURE 
print_sparse_vec(input IN VECTOR)
AS MLE MODULE MY_SPARSE_MOD
SIGNATURE 'printSparseVec(SparseVector)';
/

BEGIN
    print_sparse_vec(vector('[5, [2, 3], [41.0, 51.0]]', 5, FLOAT64, SPARSE));
END;
/

結果:

{"numDimensions":5,"indices":{"0":2,"1":3},"values":{"0":41,"1":51}}

また、Float64Arrayのようにシグネチャに型を指定することもできます。シグネチャに型が含まれていない場合、デフォルトはSparseVectorです。

CREATE OR REPLACE PROCEDURE
print_sparse_vec_64(input IN VECTOR)
AS MLE MODULE MY_SPARSE_MOD
SIGNATURE 'printSparseVec(Float64Array)';
/

BEGIN
    print_sparse_vec_64(vector('[5,[2,3],[41.0,51.0]]', 5, FLOAT64, SPARSE));
END;
/

結果:

0,0,41,51,0