1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| 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()
| }
|
|