in aiops/MicroAgents/layers/utils.py [0:0]
def get_k_order_neighbors_with_direction(G, node, k, direction:Literal['forward', 'backward', 'bidirectional']='forward'):
if k < 0:
raise ValueError("Order k must be non-negative")
# 用于保存已访问的节点,防止重复计算
visited = set()
visited.add(node)
# 双端队列保存节点和当前跳数
queue = deque([(node, 0)])
# 用字典按跳数保存后继节点
neighbors_by_order = {i: set() for i in range(1, k+1)}
if direction == 'bidirectional':
direction_func = partial(get_neighbors, G=G)
else:
direction_func = G.successors if direction == 'forward' else G.predecessors
# 在队列中进行BFS
while queue:
current_node, jumps = queue.popleft()
# 如果跳数达到K,则停止向队列中添加这个节点的子节点
if jumps < k:
for neighbor in direction_func(current_node):
if neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, jumps + 1))
# 只有当跳数小于K时我们才将其视为该阶的后继节点
if jumps + 1 <= k:
neighbors_by_order[jumps + 1].add(neighbor)
return neighbors_by_order