概述
在余弦相似度(Cosine Similarity)中,数据对象被视为矢量,它使用两个矢量之间夹角的余弦值来表示它们之间的相似性。在图中,指定节点的N个数值属性(特征)构成N维矢量,如果两个节点的矢量相似,则认为它们相似。
余弦相似度的取值范围-1到1;1意味着两个向量的方向完全一致,-1意味着两个向量的方向正好相反。

在二维空间中,两个向量A(a1, a2)和 B(b1, b2)的余弦相似度计算公式为:

在三维空间中,两个向量A(a1, a2, a3)和B(b1, b2, b3)的余弦相似度计算公式为:

下图展示了2D和3D空间中矢量A和B之间的关系,以及它们之间夹角θ:

推广到N维空间,余弦相似度的计算公式如下:

特殊说明
- 两个节点的余弦相似度理论上不依赖它们之间的连通性。
- 余弦相似度的值与向量长度无关,仅与向量方向相关。
示例图集

创建示例图集:
// 在空图集中逐行运行以下语句
create().node_schema("product")
create().node_property(@product, "price", int32).node_property(@product, "weight", int32).node_property(@product, "width", int32).node_property(@product, "height", int32)
insert().into(@product).nodes([{_id:"product1", price:50, weight:160, width:20, height:152}, {_id:"product2", price:42, weight:90, width:30, height:90}, {_id:"product3", price:24, weight:50, width:55, height:70}, {_id:"product4", price:38, weight:20, width:32, height:66}])
创建HDC图集
将当前图集全部加载到HDC服务器hdc-server-1
上,并命名为 hdc_sim_prop
:
CALL hdc.graph.create("hdc-server-1", "hdc_sim_prop", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
})
hdc.graph.create("hdc_sim_prop", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
}).to("hdc-server-1")
参数
算法名:similarity
参数名 |
类型 |
规范 |
默认值 |
可选 |
描述 |
---|---|---|---|---|---|
ids |
[]_id |
/ | / | 否 | 通过_id 指定参与计算的第一组点;若未设置则计算所有点 |
uuids |
[]_uuid |
/ | / | 否 | 通过_uuid 指定参与计算的第一组点;若未设置则计算所有点 |
ids2 |
[]_id |
/ | / | 是 | 通过_id 指定参与计算的第二组点;若未设置则计算所有点 |
uuids2 |
[]_uuid |
/ | / | 是 | 通过_uuid 指定参与计算的第二组点;若未设置则计算所有点 |
type |
String | cosine |
cosine |
否 | 指定待计算的相似度类型;计算余弦相似度时,设置为cosine |
node_schema_property |
[]"<@schema.?><property> " |
/ | / | 否 | 构成向量的数值类型点属性;所有指定的属性必须属于同一个标签(schema) |
return_id_uuid |
String | uuid , id , both |
uuid |
是 | 在结果中使用_uuid 、_id 或同时使用两者来表示点 |
order |
String | asc , desc |
/ | 是 | 根据similarity 分值对结果排序 |
limit |
Integer | ≥-1 | -1 |
是 | 限制返回的结果数;-1 返回所有结果 |
top_limit |
Integer | ≥-1 | -1 |
是 | 在选拔模式下,限制ids /uuids 中每个节点返回的结果数;-1 返回所有相似度大于0的结果。配对模式下,该参数无效 |
该算法包含两种计算模式:
- 配对:同时配置
ids
/uuids
和ids2
/uuids2
时,ids
/uuids
中的每个节点与ids2
/uuids2
中的每个节点配对(自配对除外),并逐对计算相似度。 - 选拔:若仅配置了
ids
/uuids
,则逐对计算其中各节点与图中所有其他节点间的相似度,返回所有或指定个数的相似度大于0的结果,并按相似度降序排列。
文件回写
CALL algo.similarity.write("hdc_sim_prop", {
params: {
return_id_uuid: "id",
ids: "product1",
ids2: ["product2", "product3", "product4"],
node_schema_property: ["price", "weight", "width", "height"],
type: "cosine"
},
return_params: {
file: {
filename: "cosine"
}
}
})
algo(similarity).params({
projection: "hdc_sim_prop",
return_id_uuid: "id",
ids: "product1",
ids2: ["product2", "product3", "product4"],
node_schema_property: ["price", "weight", "width", "height"],
type: "cosine"
}).write({
file: {
filename: "cosine"
}
})
结果:
_id1,_id2,similarity
product1,product2,0.986529
product1,product3,0.878858
product1,product4,0.816876
完整返回
CALL algo.similarity("hdc_sim_prop", {
params: {
return_id_uuid: "id",
ids: ["product1","product2"],
ids2: ["product2","product3","product4"],
node_schema_property: ["price", "weight", "width", "height"],
type: "cosine"
},
return_params: {}
}) YIELD cs
RETURN cs
exec{
algo(similarity).params({
return_id_uuid: "id",
ids: ["product1","product2"],
ids2: ["product2","product3","product4"],
node_schema_property: ["price", "weight", "width", "height"],
type: "cosine"
}) as cs
return cs
} on hdc_sim_prop
结果:
_id1 | _id2 | similarity |
---|---|---|
product1 | product2 | 0.986529 |
product1 | product3 | 0.878858 |
product1 | product4 | 0.816876 |
product2 | product3 | 0.934217 |
product2 | product4 | 0.881988 |
流式返回
CALL algo.similarity("hdc_sim_prop", {
params: {
return_id_uuid: "id",
ids: ["product1", "product3"],
node_schema_property: ["price", "weight", "width", "height"],
type: "cosine",
top_limit: 1
},
return_params: {
stream: {}
}
}) YIELD top
RETURN top
exec{
algo(similarity).params({
return_id_uuid: "id",
ids: ["product1", "product3"],
node_schema_property: ["price", "weight", "width", "height"],
type: "cosine",
top_limit: 1
}).stream() as cs
return cs
} on hdc_sim_prop
结果:
_id1 | _id2 | similarity |
---|---|---|
product1 | product2 | 0.883292 |
product3 | product2 | 0.877834 |