Как ВСТАВИТЬ вектор в Кассандру с помощью Java?

У меня возникли проблемы с сопоставлением типа Java Vector с моей таблицей Cassandra (Astra DB) в Java. Идея состоит в том, чтобы запросить ИНС с векторным поиском, чтобы получить рекомендации по фильмам.

Вот мое определение таблицы:

      CREATE TABLE movies (
  movie_id INT PRIMARY KEY,
  title TEXT,
  release_date DATE,
  movie_vector vector<float,7>);

Что соответствует классу:

      public class Movie {
    private int movieId;
    private String title;
    private LocalDate releaseDate;
    private CqlVector<Float> vector;

(в комплекте с геттерами и сеттерами)

И его свойства привязываются к подготовленному оператору с помощью этого CQL:

      private final static String strCQLINSERT = "INSERT INTO movies "
        + "(movie_id,title,release_date,movie_vector) "
        + "VALUES (?,?,?,?)";

Затем я определяю вектор из массиваfloatиспользуя Java Vector API, а затем попытайтесь отобразить это в моем классе.

      Movie movie = new Movie();
// setting other properties on movie here
// ...
// create vector locally
float[] fltVector = {collectionId,genre1,genre2,genre3,popularity,rating,votes};
FloatVector vector = FloatVector.fromArray(FloatVector.SPECIES_MAX,fltVector,0);
// map vector to class
movie.setVector(vector);

При установке наvectorимущество (типаCqlVector) в моем классе Movie я получаю эту ошибку:

Метод типа CqlVector неприменим для аргументов FloatVector.

Я также пробовал использовать тип CqlVectornewInstanceметод, но он, похоже, тоже не работает. Как я могу отобразитьfltVectorв мою таблицу, чтобы я мог ВСТАВИТЬ данные?

1 ответ

Таким образом, работа с векторными типами данных — это действительно новая вещь как в Java, так и в Cassandra. Фактически, на данный момент этот тип действителен только в Astra DB, а JavaFloatVectorтип не соответствует ему.

При этом есть несколько способов создать экземпляр новогоCqlVectorобъект. newInstanceМетод принимает либо строковое, либо строковое представление вектора. Строковое представление может оказаться сложным в правильном понимании, поэтомуList<Float>маршрут, вероятно, самый простой путь:

      List<Float> vectorListFloat = new ArrayList<>();

vectorListFloat.add(collectionId);
vectorListFloat.add(genre1);
vectorListFloat.add(genre2);
vectorListFloat.add(genre3);
vectorListFloat.add(popularity);
vectorListFloat.add(voteAverage);
vectorListFloat.add(voteCount);

CqlVector cqlVector = CqlVector.newInstance(vectorListFloat);

СcqlVectorобъект, созданный изnewInstance(vectorListFloat), теперь это должно работать:

      movie.setVector(cqlVector);
Другие вопросы по тегам