findNeighbors
查找图结构中的邻居节点,支持 N 跳邻居查询。
基本用法
import { UserNode } from './entities/UserNode';
// 查询直接邻居(1跳)
const neighbors = await UserNode.findNeighbors({
entityId: 'alice-id',
level: 1
});
// 查询 2 度人脉(1跳 + 2跳)
const extendedNetwork = await UserNode.findNeighbors({
entityId: 'alice-id',
level: 2
});
返回结果
返回 NeighborResult[] 数组,每个元素包含:
interface NeighborResult<T> {
node: T; // 邻居节点实例
edge: EdgeInfo; // 连接边信息
level: number; // 跳数(距离起始节点的距离)
}
interface EdgeInfo {
sourceId: string;
targetId: string;
direction: 'in' | 'out';
weight?: number;
properties?: Record<string, any>;
}
查询选项
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
entityId | string | 必填 | 起始节点 ID |
level | number | 1 | 最大跳数(1-10) |
direction | 'in' | 'out' | 'both' | 'both' | 查询方向 |
where | RuleGroup | - | 节点过滤条件 |
edgeWhere | EdgeFilterOptions | - | 边过滤条件 |
查询方向
// 出边邻居(从当前节点指出的节点)
const following = await UserNode.findNeighbors({
entityId: 'alice-id',
level: 1,
direction: 'out'
});
// 入边邻居(指向当前节点的节点)
const followers = await UserNode.findNeighbors({
entityId: 'alice-id',
level: 1,
direction: 'in'
});
// 双向邻居(默认)
const allConnections = await UserNode.findNeighbors({
entityId: 'alice-id',
level: 1,
direction: 'both'
});
节点过滤
// 只查询特定类型的邻居
const businessContacts = await UserNode.findNeighbors({
entityId: 'alice-id',
level: 2,
where: {
combinator: 'and',
rules: [{ field: 'type', operator: '=', value: 'business' }]
}
});
边过滤
// 按权重过滤
const highValueFriends = await UserNode.findNeighbors({
entityId: 'alice-id',
level: 1,
edgeWhere: {
weight: { min: 5, max: 10 }
}
});
// 按边属性过滤
const businessPartners = await UserNode.findNeighbors({
entityId: 'alice-id',
level: 2,
edgeWhere: {
properties: { category: 'business' }
}
});
// 组合过滤
const topPartners = await UserNode.findNeighbors({
entityId: 'alice-id',
level: 1,
edgeWhere: {
weight: { min: 8 },
properties: { category: 'partner' }
}
});
Level 说明
level: 1- 仅直接邻居(1跳)level: 2- 1跳 + 2跳邻居level: 3- 1跳 + 2跳 + 3跳邻居- 最大值限制为 10(防止性能问题)
- 结果不包含起始节点本身
- 结果自动去重(同一节点通过不同路径到达时只返回最短路径)
框架集成
各框架提供响应式 Hooks:
- Angular
- React
- Vue
import { useGraphNeighbors } from '@aiao/rxdb-angular';
const neighbors = useGraphNeighbors(UserNode, () => ({
entityId: userId(),
level: 2
}));
import { useGraphNeighbors } from '@aiao/rxdb-react';
const { value: neighbors, isLoading } = useGraphNeighbors(UserNode, {
entityId: userId,
level: 2
});
<script setup lang="ts">
import { useGraphNeighbors } from '@aiao/rxdb-vue';
const { value: neighbors, isLoading } = toRefs(
useGraphNeighbors(UserNode, () => ({
entityId: userId.value,
level: 2
}))
);
</script>
参考
- 图结构定义
- countNeighbors - 统计邻居数量
- findPaths - 查找路径