Vector index
创建向量索引
如下json定义了一个点类型,名字是person
, 里面有个字段是embedding
,类型是FLOAT_VECTOR
,用来存储向量数据。
目前向量数据只能在点上创建。
{
"label": "person",
"primary": "id",
"type": "VERTEX",
"properties": [{
"name": "id",
"type": "INT32",
"optional": false
}, {
"name": "age",
"type": "INT32",
"optional": false
}, {
"name": "embedding",
"type": "FLOAT_VECTOR",
"optional": false
}]
}
把上面这个json序列化成字符串,作为参数传入,建议使用驱动的参数化特性,避免自己拼接语句。
CALL db.createVertexLabelByJson($json_data)
给embedding
字段添加向量索引,第三个参数是个map,里面可以设置一些向量索引的配置参数,如下,dimension
设置向量维度是4
CALL db.addVertexVectorIndex('person','embedding', {dimension: 4});
再定义一个边,用来测试,如下json定义了一个边类型,名字是like
。
{
"label": "like",
"type": "EDGE",
"constraints": [
["person", "person"]
],
"properties": []
}
把上面这个json序列化成字符串,作为参数传入。
CALL db.createEdgeLabelByJson($json_data)
写入几条测试数据
CREATE (n1:person {id:1, age:10, embedding: [1.0,1.0,1.0,1.0]})
CREATE (n2:person {id:2, age:20, embedding: [2.0,2.0,2.0,2.0]})
CREATE (n3:person {id:3, age:30, embedding: [3.0,3.0,3.0,3.0]})
CREATE (n1)-[r:like]->(n2),
(n2)-[r:like]->(n3),
(n3)-[r:like]->(n1);
向量查询
KnnSearch
根据向量搜索出点,第四个参数是个map,里面可以指定一些向量搜索的参数。
CALL db.vertexVectorKnnSearch('person','embedding', [1.0,2.0,3.0,4.0], {top_k:2, hnsw_ef_search:10})
yield node return node
根据向量搜索出点,返回age
小于30的
CALL db.vertexVectorKnnSearch('person','embedding',[1.0,2.0,3.0,4.0], {top_k:2, hnsw_ef_search:10})
yield node where node.age < 30 return node
根据向量搜索出点,返回age小于30的点,然后再查这些点的一度邻居是谁。
CALL db.vertexVectorKnnSearch('person','embedding',[1.0,2.0,3.0,4.0], {top_k:2, hnsw_ef_search:10})
yield node where node.age < 30 with node as p
match(p)-[r]->(m) return m
RangeSearch
根据向量搜索出距离小于10的、age小于30的点,然后再查这些点的一度邻居是谁。
CALL db.vertexVectorRangeSearch('person','embedding',[1.0,2.0,3.0,4.0], {radius:10.0, hnsw_ef_search:10})
yield node where node.age < 30 with node as p
match(p)-[r]->(m) return m