Milvus
Here is a list of all available Milvus procedures:
| name | description | 
|---|---|
apoc.vectordb.milvus.info(hostOrKey, collection, $config)  | 
Get information about the specified existing collection or returns a response with code 100 if it does not exist  | 
apoc.vectordb.milvus.createCollection(hostOrKey, collection, similarity, size, $config)  | 
Creates a collection, with the name specified in the 2nd parameter, and with the specified   | 
apoc.vectordb.milvus.deleteCollection(hostOrKey, collection, $config)  | 
Deletes a collection with the name specified in the 2nd parameter.
    The default endpoint is   | 
apoc.vectordb.milvus.upsert(hostOrKey, collection, vectors, $config)  | 
Upserts, in the collection with the name specified in the 2nd parameter, the vectors [{id: 'id', vector: '<vectorDb>', medatada: '<metadata>'}].
    The default endpoint is   | 
apoc.vectordb.milvus.delete(hostOrKey, collection, ids, $config)  | 
Delete the vectors with the specified   | 
apoc.vectordb.milvus.get(hostOrKey, collection, ids, $config)  | 
Get the vectors with the specified   | 
apoc.vectordb.milvus.query(hostOrKey, collection, vector, filter, limit, $config)  | 
Retrieve closest vectors the the defined   | 
apoc.vectordb.milvus.getAndUpdate(hostOrKey, collection, ids, $config)  | 
Get the vectors with the specified   | 
apoc.vectordb.milvus.queryAndUpdate(hostOrKey, collection, vector, filter, limit, $config)  | 
Retrieve closest vectors the the defined   | 
where the 1st parameter can be a key defined by the apoc config apoc.milvus.<key>.host=myHost.
With hostOrKey=null, the default host is 'http://localhost:19530'.
Examples
Here is a list of example using a local installation using th default port 19531.
CALL apoc.vectordb.milvus.info($host, 'test_collection', '', {<optional config>})
| value | 
|---|
{"data": {"shardsNum": 1, "aliases": [], "autoId": false, "description": "", "partitionsNum": 1, "collectionName": "test_collection", "indexes": [{"metricType": "COSINE", "indexName": "vector", "fieldName": "vector"}], "load": "LoadStateLoading", "consistencyLevel": "Bounded", "fields": [{"partitionKey": false, "autoId": false, "name": "id", "description": "", "id": 100, "type": "Int64", "primaryKey": true}, {"partitionKey": false, "autoId": false, "name": "vector", "description": "", "id": 101, "params": [{"value": 4, "key": "dim"}], "type": "FloatVector", "primaryKey": false} ], "collectionID": "451046728334049293", "enableDynamicField": true, "properties": []}, "message": "", "code": 200 }  | 
CALL apoc.vectordb.milvus.createCollection('http://localhost:19531', 'test_collection', 'COSINE', 4, {<optional config>})
| data | code | 
|---|---|
null  | 
200  | 
CALL apoc.vectordb.milvus.deleteCollection('http://localhost:19531', 'test_collection', {<optional config>})
| data | code | 
|---|---|
null  | 
200  | 
CALL apoc.vectordb.milvus.upsert('http://localhost:19531', 'test_collection',
    [
        {id: 1, vector: [0.05, 0.61, 0.76, 0.74], metadata: {city: "Berlin", foo: "one"}},
        {id: 2, vector: [0.19, 0.81, 0.75, 0.11], metadata: {city: "London", foo: "two"}}
    ],
    {<optional config>})
| data | code | 
|---|---|
{"upsertCount": 2, "upsertId": [1, 2]}  | 
200  | 
CALL apoc.vectordb.milvus.get('http://localhost:19531', 'test_collection', [1,2], {<optional config>})
| score | metadata | id | vector | text | entity | 
|---|---|---|---|---|---|
null  | 
{city: "Berlin", foo: "one"}  | 
null  | 
null  | 
null  | 
null  | 
null  | 
{city: "Berlin", foo: "two"}  | 
null  | 
null  | 
null  | 
null  | 
{allResults: true}CALL apoc.vectordb.milvus.get('http://localhost:19531', 'test_collection', [1,2], {allResults: true, <optional config>})
| score | metadata | id | vector | text | entity | 
|---|---|---|---|---|---|
null  | 
{city: "Berlin", foo: "one"}  | 
1  | 
[…]  | 
null  | 
null  | 
null  | 
{city: "Berlin", foo: "two"}  | 
2  | 
[…]  | 
null  | 
null  | 
CALL apoc.vectordb.milvus.query('http://localhost:19531',
    'test_collection',
    [0.2, 0.1, 0.9, 0.7],
    { must:
        [ { key: "city", match: { value: "London" } } ]
    },
    5,
    {allResults: true, <optional config>})
| score | metadata | id | vector | text | entity | 
|---|---|---|---|---|---|
1,  | 
{city: "Berlin", foo: "one"}  | 
1  | 
[…]  | 
null  | 
null  | 
0.1  | 
{city: "Berlin", foo: "two"}  | 
2  | 
[…]  | 
null  | 
null  | 
We can define a mapping, to auto-create one/multiple nodes and relationships, by leveraging the vector metadata.
For example, if we have created 2 vectors with the above upsert procedures,
we can populate some existing nodes (i.e. (:Test {myId: 'one'}) and (:Test {myId: 'two'})):
CALL apoc.vectordb.milvus.queryAndUpdate('http://localhost:19531', 'test_collection',
    [0.2, 0.1, 0.9, 0.7],
    {},
    5,
    { mapping: {
            embeddingKey: "vect",
            nodeLabel: "Test",
            entityKey: "myId",
            metadataKey: "foo"
        }
    })
which populates the two nodes as: (:Test {myId: 'one', city: 'Berlin', vect: [vector1]}) and (:Test {myId: 'two', city: 'London', vect: [vector2]}),
which will be returned in the entity column result.
We can also set the mapping configuration mode to CREATE_IF_MISSING (which creates nodes if not exist), READ_ONLY (to search for nodes/rels, without making updates) or UPDATE_EXISTING (default behavior):
CALL apoc.vectordb.milvus.queryAndUpdate('http://localhost:19531', 'test_collection',
    [0.2, 0.1, 0.9, 0.7],
    {},
    5,
    { mapping: {
            mode: "CREATE_IF_MISSING",
            embeddingKey: "vect",
            nodeLabel: "Test",
            entityKey: "myId",
            metadataKey: "foo"
        }
    })
which creates and 2 new nodes as above.
Or, we can populate an existing relationship (i.e. (:Start)-[:TEST {myId: 'one'}]→(:End) and (:Start)-[:TEST {myId: 'two'}]→(:End)):
CALL apoc.vectordb.milvus.queryAndUpdate('http://localhost:19531', 'test_collection',
    [0.2, 0.1, 0.9, 0.7],
    {},
    5,
    { mapping: {
            embeddingKey: "vect",
            relType: "TEST",
            entityKey: "myId",
            metadataKey: "foo"
        }
    })
which populates the two relationships as: ()-[:TEST {myId: 'one', city: 'Berlin', vect: [vector1]}]-()
and ()-[:TEST {myId: 'two', city: 'London', vect: [vector2]}]-(),
which will be returned in the entity column result.
We can also use mapping for apoc.vectordb.milvus.query procedure, to search for nodes/rels fitting label/type and metadataKey, without making updates
(i.e. equivalent to *.queryOrUpdate procedure with mapping config having mode: "READ_ONLY").
For example, with the previous relationships, we can execute the following procedure, which just return the relationships in the column rel:
CALL apoc.vectordb.milvus.query('http://localhost:19531', 'test_collection',
    [0.2, 0.1, 0.9, 0.7],
    {},
    5,
    { mapping: {
            embeddingKey: "vect",
            relType: "TEST",
            entityKey: "myId",
            metadataKey: "foo"
        }
    })
| 
 We can use mapping with   | 
| 
 To optimize performances, we can choose what to  For example, by executing a   | 
It is possible to execute vector db procedures together with the apoc.ml.rag as follow:
CALL apoc.vectordb.milvus.getAndUpdate($host, $collection, [<id1>, <id2>], $conf) YIELD node, metadata, id, vector
WITH collect(node) as paths
CALL apoc.ml.rag(paths, $attributes, $question, $confPrompt) YIELD value
RETURN value
which returns a string that answers the $question by leveraging the embeddings of the db vector.
CALL apoc.vectordb.milvus.delete('http://localhost:19531', 'test_collection', [1,2], {<optional config>})
| data | code | 
|---|---|
null  | 
200  |