✓ 文件回写 ✕ 属性回写 ✓ 直接返回 ✓ 流式返回 ✕ 统计值
概述
在数学中,欧几里得空间中两点之间的欧几里得距离(Euclidean Distance,也称为欧氏距离)是两点之间的直线长度。在图中,指定节点的 N 个数值属性(特征)来表示节点在 N 维欧几里得空间中的位置。
基本概念
欧几里得距离
在二维空间中,两个点 A(x1, y1) 和 B(x2, y2) 之间的欧几里得距离公式为:
在三维空间中,两个点 A(x1, y1, z1) 和 B(x2, y2, z2) 之间的欧几里得距离公式为:
推广到 N 维空间,欧几里得距离公式为:
其中,xi1 表示第一个点的第 i 维坐标,xi2 表示第二个点的第 i 维坐标。
欧几里得距离的取值范围是 0 到 +∞,数值越小,两个节点越相似。
标准化欧几里得距离
标准化欧几里得距离将欧几里得距离的取值范围缩放到 0 至 1;越接近 1,两个节点越相似。
Ultipa 采用的标准化欧几里得距离计算公式为:
特殊说明
- 两个节点的欧几里得距离理论上不依赖它们之间的连通性。
语法
- 命令:
algo(similarity)
- 参数:
名称 |
类型 |
规范 |
默认 |
可选 |
描述 |
---|---|---|---|---|---|
ids / uuids | []_id / []_uuid |
/ | / | 否 | 待计算的第一组节点的 ID / UUID |
ids2 / uuids2 | []_id / []_uuid |
/ | / | 是 | 待计算的第二组节点的 ID / UUID |
type | string | euclideanDistance , euclidean |
cosine |
否 | 相似度衡量指标;euclideanDistance 计算欧几里得距离,euclidean 计算标准化欧几里得距离 |
node_schema_property | []@<schema>?.<property> |
必须 LTE | / | 否 | 必须指定至少两个数值类的点属性来构成向量 |
limit | int | >=-1 | -1 |
是 | 返回的结果条数,-1 返回所有结果 |
top_limit | int | >=-1 | -1 |
是 | 限制 top_list 的长度,-1 返回完整的 top_list |
本算法有两种计算模式:
- 配对:同时配置了
ids/uuids
和ids2/uuids2
时,将第一组与第二组中的节点两两配对(笛卡尔乘积),逐对计算相似度。 - 选拔:仅配置
ids/uuids
时,对于每一个节点,计算其与图中其他所有节点的相似度,目的是选拔与其最相似的节点,返回的top_list
包含所有与其相似度大于 0 的结果并按相似度降序排列。
示例
示例图包含 4 个产品(忽略边),每个产品包含 price、weight、width 和 height 属性:
文件回写
计算模式 | 配置项 | 回写内容 |
---|---|---|
配对 | filename | node1 ,node2 ,similarity |
选拔 | filename | node ,top_list |
algo(similarity).params({
uuids: [1],
uuids2: [2,3,4],
node_schema_property: [price,weight,width,height],
type: "euclideanDistance"
}).write({
file:{
filename: "ed"
}
})
结果:文件 ed
product1,product2,94.3822
product1,product3,143.962
product1,product4,165.179
algo(similarity).params({
uuids: [1,2,3,4],
node_schema_property: [price,weight,width,height],
type: "euclidean"
}).write({
file:{
filename: "ed_list"
}
})
结果:文件 ed_list
product1,product2:0.010484;product3:0.006898;product4:0.006018;
product2,product3:0.018082;product4:0.013309;product1:0.010484;
product3,product4:0.024091;product2:0.018082;product1:0.006898;
product4,product3:0.024091;product2:0.013309;product1:0.006018;
直接返回
计算模式 |
别名序号 |
类型 |
描述 |
列名 |
---|---|---|---|---|
配对 | 0 | []perNodePair | 各点对及相似度 | node1 , node2 , similarity |
选拔 | 0 | []perNode | 各点及其选拔结果 | node , top_list |
algo(similarity).params({
uuids: [1],
uuids2: [2,3,4],
node_schema_property: [price,weight,width,height],
type: "euclideanDistance"
}) as distance
return distance
order by distance.similarity desc
结果:distance
node1 | node2 | similarity |
---|---|---|
1 | 4 | 165.178691119648 |
1 | 3 | 143.96180048888 |
1 | 2 | 94.3822017119753 |
algo(similarity).params({
uuids: [1,2],
type: "euclidean",
node_schema_property: [price,weight,width,height],
top_limit: 1
}) as top
return top
结果:top
node | top_list |
---|---|
1 | 2:0.010484, |
2 | 3:0.018082, |
流式返回
计算模式 |
别名序号 |
类型 |
描述 |
列名 |
---|---|---|---|---|
配对 | 0 | []perNodePair | 各点对及相似度 | node1 , node2 , similarity |
选拔 | 0 | []perNode | 各点及其选拔结果 | node , top_list |
algo(similarity).params({
uuids: [3],
uuids2: [1,2,4],
node_schema_property: [price,weight,width,height],
type: "euclidean"
}).stream() as distance
where distance.similarity > 0.01
return distance
结果:distance
node1 | node2 | similarity |
---|---|---|
3 | 2 | 0.0180816471945529 |
3 | 4 | 0.0240910110982062 |
algo(similarity).params({
uuids: [1,3],
node_schema_property: [price,weight,width,height],
type: "euclideanDistance",
top_limit: 1
}).stream() as top
return top
结果:top
node | top_list |
---|---|
1 | 4:165.178691, |
3 | 1:143.961800, |