package index import ( "fmt" "github.com/aisim/kb-cli/internal/graph" ) // LoadRWRGraph 加载 RWR 邻接(无向、带权)。 // 权重:wikilink exact=1.0 / fuzzy=0.5 / entity=1.0 / tag=0.5(tag 扇出大降权)。 // 只加载与种子同连通域的边不可行(SQLite 无图查询),全量加载后 RWR 内部按种子收敛—— // 458 节点 / ~2k 边规模下全量加载 <5ms,可接受。 func (s *Store) LoadRWRGraph() (map[int64][]graph.AdjEdge, error) { rows, err := s.db.Query(` SELECT from_node, to_node, relation, provenance FROM edges WHERE relation IN ('wikilink', 'entity', 'tag')`) if err != nil { return nil, fmt.Errorf("加载边失败: %w", err) } defer rows.Close() adj := make(map[int64][]graph.AdjEdge) add := func(from, to int64, w float64) { adj[from] = append(adj[from], graph.AdjEdge{To: to, Weight: w}) adj[to] = append(adj[to], graph.AdjEdge{To: from, Weight: w}) } for rows.Next() { var from, to int64 var relation, prov string if err := rows.Scan(&from, &to, &relation, &prov); err != nil { return nil, err } var w float64 switch relation { case "wikilink": if prov == "exact" { w = 1.0 } else { w = 0.5 } case "entity": w = 1.0 case "tag": w = 0.5 default: continue } add(from, to, w) } return adj, rows.Err() }