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