Udostępnij przez


Używanie typu danych wektorów ze sterownikiem JDBC

pobierz sterownik JDBC

Począwszy od wersji 13.2.0, sterownik JDBC obsługuje typ danych wektorowych . Funkcja Vector jest również obsługiwana w przypadku funkcji, takich jak parametry Table-Valued i narzędzie BulkCopy, z pewnymi ograniczeniami. Na tej stronie przedstawiono różne przypadki użycia typu danych wektora ze sterownikiem JDBC. Aby zapoznać się z omówieniem typów danych wektorowych , zobacz Vector data type (Typ danych wektorowych).

Tworzenie obiektu wektorowego

Klasa microsoft.sql.Vector to niestandardowa implementacja przeznaczona do reprezentowania danych wektorowych w sterowniku JDBC. Zapewnia ona ustrukturyzowany sposób obsługi danych o wysokim wymiarach, w tym serializacji i deserializacji, przy jednoczesnym zapewnieniu zgodności z typem danych wektorowych programu SQL Server. Obiekt wektorowy powinien zawierać liczbę elementów, wskaźnik typu i dane.

public enum VectorDimensionType {
        FLOAT32 // 32-bit (single precision) float
}

private VectorDimensionType vectorType; // The type of values in the data array
private int dimensionCount; // Number of dimensions in the vector
private Object[] data; // An array containing the vector's numerical values

Sterownik JDBC firmy Microsoft dla programu SQL Server oferuje dwie metody inicjowania obiektu wektorowego, zapewniając elastyczność dla różnych przypadków użycia i danych wejściowych.

Tworzenie obiektu wektorowego z liczbą wymiarów i typem wektora

Konstruktor:

public Vector(int dimensionCount, VectorDimensionType vectorType, Object[] data);

Przykład:

Vector vector = new Vector(3, Vector.VectorDimensionType.FLOAT32, new Float[]{1.0f, 2.0f, 3.0f});

Tworzenie obiektu wektorowego z dokładnością i skalowaniem

Konstruktor:

public Vector(int precision, int scale, Object[] data);

Gdzie parametry to:

  • precyzja: liczba wymiarów w wektorze.
  • scale: wartość skalowania, która reprezentuje liczbę bajtów na wymiar. 4 bajty reprezentuje FLOAT32.
  • data: tablica float[] zawierająca wartości liczbowe w wektorze.

Przykład:

Vector vector = new Vector(3, 4, new Float[]{1.0f, 2.0f, 3.0f});

Wypełnianie i pobieranie tabeli

Oto kilka przykładów kodu, które wypełniają i pobierają dane wektorowe z bazy danych. W przykładach przyjęto założenie, że tabela z kolumną wektorową zdefiniowana w następujący sposób:

CREATE TABLE sampleTable (vector_col vector(3))

Wstaw wartości z zwykłą instrukcją INSERT:

try (Statement stmt = connection.createStatement()){
    stmt.execute("insert into sampleTable values ('[0.1, 2.0, 3.0]')");
}

Wstaw wartości z przygotowaną instrukcją i parametrem wektora :

Vector vector = new Vector(3, Vector.VectorDimensionType.FLOAT32, new Float[]{1.0f, 2.0f, 3.0f});
try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
    preparedStatement.setObject(1, vector, microsoft.sql.Types.VECTOR);
    preparedStatement.execute();
}

Wstaw wartość null z przygotowaną instrukcją i parametrem:

Vector vector = new Vector(1, Vector.VectorDimensionType.FLOAT32, null);
try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
    preparedStatement.setObject(1, vector, microsoft.sql.Types.VECTOR);
    preparedStatement.execute();
}
try (PreparedStatement preparedStatement = con.prepareStatement("insert into sampleTable values (?)")) {
    preparedStatement.setObject(1, null)
    preparedStatement.execute();
}

Odczytywanie wartości wektorów z tabeli:

try (SQLServerResultSet resultSet = (SQLServerResultSet) stmt.executeQuery("select * from sampleTable")) {
    assertTrue(resultSet.next(), "No result found for inserted vector.");
    ResultSetMetaData metaData = resultSet.getMetaData();
    int columnCount = metaData.getColumnCount();

    while (resultSet.next()) {
        for (int i = 1; i <= columnCount; i++) {
            String columnName = metaData.getColumnName(i);
            int columnType = metaData.getColumnType(i); // from java.sql.Types

            Object value = null;
            switch (columnType) {
                case Types.VARCHAR:
                case Types.NVARCHAR:
                    value = resultSet.getString(i);
                    break;
                case microsoft.sql.Types.VECTOR:
                    value = resultSet.getObject(i, microsoft.sql.Vector.class);
            }

            System.out.println(columnName + " = " + value + " (type: " + columnType + ")");
        }
    }
}

Używanie procedur składowanych z wektorem

Z następującą procedurą składowaną:

String sql = "CREATE PROCEDURE " + inputProc +
             " @p0 VECTOR(3) OUTPUT AS " +
             " SELECT TOP 1 @p0 = col_vector FROM sampleTable ";

Zwróć parametr wyjściowy wektora z następującym przykładem:

try (CallableStatement callableStatement = con.prepareCall("{call " + inputProc + " (?) }")) {
    callableStatement.registerOutParameter(1, microsoft.sql.Types.VECTOR, 3, 4);
    callableStatement.execute();
}

Używanie tvp z wektorem

Vector vector = new Vector(3, Vector.VectorDimensionType.FLOAT32, new Float[]{1.0f, 2.0f, 3.0f});
SQLServerDataTable tvp = new SQLServerDataTable();
tvp.addColumnMetadata("vector_col", microsoft.sql.Types.VECTOR);
tvp.addRow(vector);

try (SQLServerPreparedStatement preparedStatement = (SQLServerPreparedStatement) con.prepareStatement( "insert into sampleTable select * from (?)")) {
    pstmt.setStructured(1, TVP_NAME, tvp);
    pstmt.execute();
}

Używanie narzędzia SQLServerBulkCopy z tabeli źródłowej do tabeli docelowej z wektorem

Wektory mogą być używane w poleceniach kopiowania zbiorczego:

Vector vector = new Vector(3, Vector.VectorDimensionType.FLOAT32, new Float[]{1.0f, 2.0f, 3.0f});
try (Statement stmt = con.createStatement();
        SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(con)) {

        stmt.executeUpdate("create table destinationTable (vector_col vector(3))");

        bulkCopy.setDestinationTableName("destinationTable");
        bulkCopy.writeToServer(vector);
    }

Używanie funkcji bulkCopy z pliku CSV do tabeli docelowej z wektorem

Wektory można importować z plików CSV.

Wklej następującą zawartość do pliku CSV o nazwie vectors.csv:

vector_col
"[1.0,2.0,3.0]"
"[4.0,5.0,6.0]"
try (Statement stmt = con.createStatement();
    SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(con);
    SQLServerBulkCSVFileRecord fileRecord = new SQLServerBulkCSVFileRecord("vectors.csv", null, ",", true)) {

        stmt.executeUpdate("create table destinationTable (vector_col vector(3))");

        // Add column metadata for the CSV file
        fileRecord.addColumnMetadata(1, "vector_col", microsoft.sql.Types.VECTOR, 3, 4);
        fileRecord.setEscapeColumnDelimitersCSV(true);

        bulkCopy.setDestinationTableName("destinationTable");
        bulkCopy.writeToServer(fileRecord);
}

Zgodność z poprzednimi wersjami

Jeśli aplikacja nie jest aktualizowana w celu obsługi typu danych wektorowych , sterownik zapewnia zgodność z poprzednimi wersjami, umożliwiając odczyt typów danych wektorowych jako typy zgodne z poprzednimi wersjami. To zachowanie jest kontrolowane za pomocą vectorTypeSupport właściwości parametrów połączenia. Obsługiwane wartości to off (serwer wysyła typy wektorów jako dane ciągu w formacie JSON) i v1 (serwer wysyła typy wektorów FLOAT32 jako dane wektorowe). Domyślna wartość to v1.

Ograniczenia wektora

Aby uzyskać szczegółowe ograniczenia, zobacz Ograniczenia typów danych wektorów.

Opis typów danych sterownika JDBC