All Downloads are FREE. Search and download functionalities are using the official Maven repository.

apoc.vectordb.WeaviateHandler Maven / Gradle / Ivy

package apoc.vectordb;

import apoc.util.UrlResolver;
import org.neo4j.internal.kernel.api.procs.ProcedureCallContext;

import java.util.List;
import java.util.Map;

import static apoc.ml.RestAPIConfig.BODY_KEY;
import static apoc.ml.RestAPIConfig.METHOD_KEY;
import static apoc.util.MapUtil.map;
import static apoc.vectordb.VectorEmbeddingConfig.FIELDS_KEY;
import static apoc.vectordb.VectorEmbeddingConfig.METADATA_KEY;
import static apoc.vectordb.VectorEmbeddingConfig.VECTOR_KEY;

public class WeaviateHandler implements VectorDbHandler {

    @Override
    public String getUrl(String hostOrKey) {
        String url = new UrlResolver("http", "localhost", 8000)
                .getUrl("weaviate", hostOrKey);
        return url + "/v1";
    }

    @Override
    public VectorEmbeddingHandler getEmbedding() {
        return new WeaviateEmbeddingHandler();
    }

    @Override
    public String getLabel() {
        return "Weaviate";
    }

    // -- embedding handler
    static class WeaviateEmbeddingHandler implements VectorEmbeddingHandler {

        @Override
        public  VectorEmbeddingConfig fromGet(Map config, ProcedureCallContext procedureCallContext, List ids, String collection) {
            config.putIfAbsent(BODY_KEY, null);
            return populateApiBodyRequest(getVectorEmbeddingConfig(config), Map.of());
        }

        @Override
        public VectorEmbeddingConfig fromQuery(Map config, ProcedureCallContext procedureCallContext, List vector, Object filter, long limit, String collection) {
            List fields = procedureCallContext.outputFields().toList();
            config.putIfAbsent(METHOD_KEY, "POST");
            VectorEmbeddingConfig vectorEmbeddingConfig = getVectorEmbeddingConfig(config);

            List list = (List) config.get(FIELDS_KEY);
            if (list == null) {
                throw new RuntimeException("You have to define `field` list of parameter to be returned");
            }
            Object fieldList = String.join("\n", list);

            filter = filter == null
                    ? ""
                    : ", where: " + filter;

            String includeVector = (fields.contains("vector") && vectorEmbeddingConfig.isAllResults()) ? ",vector" : "";
            String additional = "_additional {id, distance " + includeVector  + "}";
            String query = """
                  {
                      Get {
                        %s(limit: %s, nearVector: {vector: %s } %s) {%s  %s}
                      }
                  }
                    """.formatted(
                    collection, limit, vector, filter, fieldList, additional
            );

            Map additionalBodies = map("query", query);

            return populateApiBodyRequest(vectorEmbeddingConfig, additionalBodies);
        }

        private static VectorEmbeddingConfig getVectorEmbeddingConfig(Map config) {
            config.putIfAbsent(VECTOR_KEY, "vector");
            config.putIfAbsent(METADATA_KEY, "properties");

            return new VectorEmbeddingConfig(config);
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy