跳到主要内容

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>;
}

查询选项

选项类型默认值说明
entityIdstring必填起始节点 ID
levelnumber1最大跳数(1-10)
direction'in' | 'out' | 'both''both'查询方向
whereRuleGroup-节点过滤条件
edgeWhereEdgeFilterOptions-边过滤条件

查询方向

// 出边邻居(从当前节点指出的节点)
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:

import { useGraphNeighbors } from '@aiao/rxdb-angular';

const neighbors = useGraphNeighbors(UserNode, () => ({
entityId: userId(),
level: 2
}));

参考