Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.