Milvus

以下是所有可用 Milvus 过程的列表

名称 描述

apoc.vectordb.milvus.createCollection(hostOrKey, collection, similarity, size, $config)

创建集合,集合名称在第二个参数中指定,并具有指定的similaritysize。默认端点为 <hostOrKey 参数>/v2/vectordb/collections/create

apoc.vectordb.milvus.deleteCollection(hostOrKey, collection, $config)

删除第二个参数中指定名称的集合。默认端点为 <hostOrKey 参数>/v2/vectordb/collections/drop

apoc.vectordb.milvus.upsert(hostOrKey, collection, vectors, $config)

在第二个参数中指定名称的集合中更新或插入向量 [{id: 'id', vector: '<vectorDb>', medatada: '<metadata>'}]. 默认端点为 <hostOrKey 参数>/v2/vectordb/entities/upsert

apoc.vectordb.milvus.delete(hostOrKey, collection, ids, $config)

删除指定ids 的向量。默认端点为 <hostOrKey 参数>/v2/vectordb/entities/delete

apoc.vectordb.milvus.get(hostOrKey, collection, ids, $config)

获取指定ids 的向量。默认端点为 <hostOrKey 参数>/v2/vectordb/entities/get

apoc.vectordb.milvus.query(hostOrKey, collection, vector, filter, limit, $config)

检索在第二个参数中指定名称的集合中定义的vector 最接近的向量,limit 为结果数。默认端点为 <hostOrKey 参数>/v2/vectordb/entities/search

apoc.vectordb.milvus.getAndUpdate(hostOrKey, collection, ids, $config)

获取指定ids 的向量。默认端点为 <hostOrKey 参数>/v2/vectordb/entities/get,并可以选择创建/更新 neo4j 实体。

apoc.vectordb.milvus.queryAndUpdate(hostOrKey, collection, vector, filter, limit, $config)

检索在第二个参数中指定名称的集合中定义的vector 最接近的向量,limit 为结果数,并可以选择创建/更新 neo4j 实体。默认端点为 <hostOrKey 参数>/v2/vectordb/entities/search

其中第一个参数可以是 apoc 配置 apoc.milvus.<key>.host=myHost 定义的键。当 hostOrKey=null 时,默认主机为 'http://localhost:19530'。

示例

这是一个使用本地安装和默认端口 19531 的示例列表。

创建集合(它利用了此 API
CALL apoc.vectordb.milvus.createCollection('http://localhost:19531', 'test_collection', 'COSINE', 4, {<optional config>})
删除集合(它利用了此API
CALL apoc.vectordb.milvus.deleteCollection('http://localhost:19531', 'test_collection', {<optional config>})
更新向量(它利用了此API
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>})
获取向量(它利用了此API
CALL apoc.vectordb.milvus.get('http://localhost:19531', 'test_collection', [1,2], {<optional config>})
表1. 示例结果
分数 元数据 ID 向量 文本 实体 错误

{city: "Berlin", foo: "one"}

{city: "Berlin", foo: "two"}

如果出现错误,例如由于apoc.vectordb.milvus.query的第三个参数向量大小错误,则错误字段将被填充,例如

表2. 示例结果
分数 元数据 ID 向量 文本 错误

…请检查主键及其类型只能在[int, string]中,错误:无法将类型为string的“wrong”转换为int64…

使用{allResults: true}获取向量
CALL apoc.vectordb.milvus.get('http://localhost:19531', 'test_collection', [1,2], {allResults: true, <optional config>})
表3. 示例结果
分数 元数据 ID 向量 文本 实体 错误

{city: "Berlin", foo: "one"}

1

[…​]

{city: "Berlin", foo: "two"}

2

[…​]

查询向量(它利用了此API
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>})
表4. 示例结果
分数 元数据 ID 向量 文本 实体 错误

1,

{city: "Berlin", foo: "one"}

1

[…​]

0.1

{city: "Berlin", foo: "two"}

2

[…​]

如果出现错误,例如由于apoc.vectordb.milvus.query的第三个参数向量大小错误,则错误字段将被填充,例如

表5. 示例结果
分数 元数据 ID 向量 文本 错误

…只能接受json格式的请求,错误:维度:4,但[]float的长度为3:无效参数[expected=FloatVector][actual=[0.2,0.1,0.9]]…

我们可以定义一个映射,利用向量元数据自动创建一个或多个节点和关系。

例如,如果我们使用上述更新过程创建了两个向量,我们可以填充一些现有的节点(即(:Test {myId: 'one'})(: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"
        }
    })

这将填充这两个节点为:(:Test {myId: 'one', city: 'Berlin', vect: [vector1]})(:Test {myId: 'two', city: 'London', vect: [vector2]}),这将在“entity”列结果中返回。

我们还可以将映射配置的mode设置为CREATE_IF_MISSING(如果不存在则创建节点)、READ_ONLY(搜索节点/关系,不进行更新)或UPDATE_EXISTING(默认行为)

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"
        }
    })

这将创建上面两个新节点。

或者,我们可以填充现有的关系(即(:Start)-[:TEST {myId: 'one'}]→(:End)(: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"
        }
    })

这将填充这两个关系为:()-[:TEST {myId: 'one', city: 'Berlin', vect: [vector1]}]-()()-[:TEST {myId: 'two', city: 'London', vect: [vector2]}]-(),这将在“entity”列结果中返回。

我们还可以将映射用于apoc.vectordb.milvus.query过程,以搜索符合标签/类型和元数据键的节点/关系,而无需进行更新(即等效于*.queryOrUpdate过程,其映射配置具有mode: "READ_ONLY")。

例如,使用前面的关系,我们可以执行以下过程,该过程仅在“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"
        }
    })

我们也可以将映射与apoc.vectordb.milvus.get*过程一起使用。

为了优化性能,我们可以选择使用apoc.vectordb.milvus.query*apoc.vectordb.milvus.get*过程YIELD什么。

例如,通过执行CALL apoc.vectordb.milvus.query(…​) YIELD metadata, score, id,RestAPI请求将包含{"with_payload": false, "with_vectors": false},以便我们不返回不需要的其他值。

可以将向量数据库过程与apoc.ml.rag一起执行,如下所示

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
删除向量(它利用了此API
CALL apoc.vectordb.milvus.delete('http://localhost:19531', 'test_collection', [1,2], {<optional config>})

性能

下表显示了在16,384条记录样本上所有操作花费的时间,使用MacBook Pro M3 Pro 18GB Ram,使用带有8个CPU的Docker进行测试,内存限制为10GB,交换空间为1.5GB。

表6. 性能结果
操作 时间(毫秒)

apoc.vectordb.milvus.createCollection

69

apoc.vectordb.milvus.upsert

567

apoc.vectordb.milvus.get

3508

apoc.vectordb.milvus.query

459

apoc.vectordb.milvus.delete

411

apoc.vectordb.milvus.deleteCollection

62