sxng-cli 1.0.9 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/graph-add.d.ts.map +1 -1
- package/dist/commands/graph-add.js +9 -1
- package/dist/commands/graph-add.js.map +1 -1
- package/dist/commands/graph-drill.d.ts +11 -0
- package/dist/commands/graph-drill.d.ts.map +1 -0
- package/dist/commands/graph-drill.js +26 -0
- package/dist/commands/graph-drill.js.map +1 -0
- package/dist/commands/graph-explore.d.ts +10 -0
- package/dist/commands/graph-explore.d.ts.map +1 -0
- package/dist/commands/graph-explore.js +32 -0
- package/dist/commands/graph-explore.js.map +1 -0
- package/dist/commands/graph-obfuscate.d.ts +17 -0
- package/dist/commands/graph-obfuscate.d.ts.map +1 -0
- package/dist/commands/graph-obfuscate.js +110 -0
- package/dist/commands/graph-obfuscate.js.map +1 -0
- package/dist/commands/graph-search.d.ts +11 -0
- package/dist/commands/graph-search.d.ts.map +1 -0
- package/dist/commands/graph-search.js +19 -0
- package/dist/commands/graph-search.js.map +1 -0
- package/dist/commands/graph-traverse.d.ts +10 -0
- package/dist/commands/graph-traverse.d.ts.map +1 -0
- package/dist/commands/graph-traverse.js +39 -0
- package/dist/commands/graph-traverse.js.map +1 -0
- package/dist/commands/query-graph.d.ts +2 -0
- package/dist/commands/query-graph.d.ts.map +1 -1
- package/dist/commands/query-graph.js +66 -0
- package/dist/commands/query-graph.js.map +1 -1
- package/dist/deep/co-occurrence.d.ts +50 -0
- package/dist/deep/co-occurrence.d.ts.map +1 -0
- package/dist/deep/co-occurrence.js +95 -0
- package/dist/deep/co-occurrence.js.map +1 -0
- package/dist/deep/degree-utils.d.ts +39 -0
- package/dist/deep/degree-utils.d.ts.map +1 -0
- package/dist/deep/degree-utils.js +42 -0
- package/dist/deep/degree-utils.js.map +1 -0
- package/dist/deep/extractor.d.ts +7 -2
- package/dist/deep/extractor.d.ts.map +1 -1
- package/dist/deep/extractor.js +143 -78
- package/dist/deep/extractor.js.map +1 -1
- package/dist/deep/graph-explore.d.ts +115 -0
- package/dist/deep/graph-explore.d.ts.map +1 -0
- package/dist/deep/graph-explore.js +586 -0
- package/dist/deep/graph-explore.js.map +1 -0
- package/dist/deep/graph-obfuscate.d.ts +51 -0
- package/dist/deep/graph-obfuscate.d.ts.map +1 -0
- package/dist/deep/graph-obfuscate.js +226 -0
- package/dist/deep/graph-obfuscate.js.map +1 -0
- package/dist/deep/graph-preprocess.d.ts +41 -0
- package/dist/deep/graph-preprocess.d.ts.map +1 -0
- package/dist/deep/graph-preprocess.js +32 -0
- package/dist/deep/graph-preprocess.js.map +1 -0
- package/dist/deep/graph-sampling.d.ts +51 -0
- package/dist/deep/graph-sampling.d.ts.map +1 -0
- package/dist/deep/graph-sampling.js +409 -0
- package/dist/deep/graph-sampling.js.map +1 -0
- package/dist/deep/graph.d.ts +24 -1
- package/dist/deep/graph.d.ts.map +1 -1
- package/dist/deep/graph.js +42 -1
- package/dist/deep/graph.js.map +1 -1
- package/dist/deep/iteration-data.d.ts +38 -0
- package/dist/deep/iteration-data.d.ts.map +1 -0
- package/dist/deep/iteration-data.js +48 -0
- package/dist/deep/iteration-data.js.map +1 -0
- package/dist/deep/path-extraction.d.ts +53 -0
- package/dist/deep/path-extraction.d.ts.map +1 -0
- package/dist/deep/path-extraction.js +229 -0
- package/dist/deep/path-extraction.js.map +1 -0
- package/dist/deep/quality-assess.d.ts +45 -0
- package/dist/deep/quality-assess.d.ts.map +1 -0
- package/dist/deep/quality-assess.js +125 -0
- package/dist/deep/quality-assess.js.map +1 -0
- package/dist/deep/query-redundancy.d.ts +39 -0
- package/dist/deep/query-redundancy.d.ts.map +1 -0
- package/dist/deep/query-redundancy.js +109 -0
- package/dist/deep/query-redundancy.js.map +1 -0
- package/dist/deep/query-suggest.d.ts +35 -0
- package/dist/deep/query-suggest.d.ts.map +1 -0
- package/dist/deep/query-suggest.js +98 -0
- package/dist/deep/query-suggest.js.map +1 -0
- package/dist/deep/recovery-analysis.d.ts +61 -0
- package/dist/deep/recovery-analysis.d.ts.map +1 -0
- package/dist/deep/recovery-analysis.js +188 -0
- package/dist/deep/recovery-analysis.js.map +1 -0
- package/dist/deep/search-strategy.d.ts +37 -0
- package/dist/deep/search-strategy.d.ts.map +1 -0
- package/dist/deep/search-strategy.js +99 -0
- package/dist/deep/search-strategy.js.map +1 -0
- package/dist/deep/session.d.ts +2 -0
- package/dist/deep/session.d.ts.map +1 -1
- package/dist/deep/session.js +1 -1
- package/dist/deep/session.js.map +1 -1
- package/dist/deep/simhash.d.ts +5 -0
- package/dist/deep/simhash.d.ts.map +1 -1
- package/dist/deep/simhash.js +16 -0
- package/dist/deep/simhash.js.map +1 -1
- package/dist/deep/tfidf.d.ts +38 -0
- package/dist/deep/tfidf.d.ts.map +1 -0
- package/dist/deep/tfidf.js +103 -0
- package/dist/deep/tfidf.js.map +1 -0
- package/dist/runCli.d.ts +3 -1
- package/dist/runCli.d.ts.map +1 -1
- package/dist/runCli.js +762 -307
- package/dist/runCli.js.map +1 -1
- package/package.json +17 -4
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph sampling strategies for knowledge graph exploration.
|
|
3
|
+
*
|
|
4
|
+
* Given a graph, seed entities, and a strategy, produces a sampled subgraph
|
|
5
|
+
* focused on the most relevant structures for reasoning.
|
|
6
|
+
*
|
|
7
|
+
* Strategies:
|
|
8
|
+
* - augmented_chain: sequential entity chain with attribute enrichment
|
|
9
|
+
* - dual_core_bridge: two seed entities converging on a shared target
|
|
10
|
+
* - community_core_path: high-degree hub → peripheral entities
|
|
11
|
+
* - deep_chain: depth-limited DFS (max 5-8 hops)
|
|
12
|
+
* - mixed: randomly pick one of the above
|
|
13
|
+
*/
|
|
14
|
+
import { getEntityDegree, filterEntitiesByDegree, adaptiveDegreeRange } from './degree-utils.js';
|
|
15
|
+
// ── Helpers ───────────────────────────────────────────────────────
|
|
16
|
+
/** Create a simple seeded PRNG (mulberry32). */
|
|
17
|
+
function mulberry32(seed) {
|
|
18
|
+
let s = seed | 0;
|
|
19
|
+
return () => {
|
|
20
|
+
s = (s + 0x6D2B79F5) | 0;
|
|
21
|
+
let t = Math.imul(s ^ (s >>> 15), 1 | s);
|
|
22
|
+
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
|
|
23
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function toSampledEntity(graph, nodeId) {
|
|
27
|
+
const attrs = graph.getNodeAttributes(nodeId);
|
|
28
|
+
return {
|
|
29
|
+
id: nodeId,
|
|
30
|
+
label: attrs.label,
|
|
31
|
+
entityType: attrs.entityType,
|
|
32
|
+
score: attrs.score,
|
|
33
|
+
degree: getEntityDegree(graph, nodeId),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function collectEdge(graph, source, target) {
|
|
37
|
+
if (!graph.hasEdge(source, target))
|
|
38
|
+
return null;
|
|
39
|
+
const attrs = graph.getEdgeAttributes(source, target);
|
|
40
|
+
return { source, target, relation: attrs.relation, weight: attrs.weight };
|
|
41
|
+
}
|
|
42
|
+
function collectAllEdgesBetween(graph, nodeSet) {
|
|
43
|
+
const edges = [];
|
|
44
|
+
graph.forEachEdge((edge, attrs, source, target) => {
|
|
45
|
+
if (nodeSet.has(source) && nodeSet.has(target)) {
|
|
46
|
+
edges.push({ source, target, relation: attrs.relation, weight: attrs.weight });
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return edges;
|
|
50
|
+
}
|
|
51
|
+
/** Filter entity neighbors by adaptive degree range.
|
|
52
|
+
* Falls back to all entity neighbors if degree filtering removes everything
|
|
53
|
+
* (common for very small graphs where adaptive range is too tight). */
|
|
54
|
+
function degreeFilteredNeighbors(graph, nodeId, config) {
|
|
55
|
+
const range = adaptiveDegreeRange(graph, {
|
|
56
|
+
minDegree: config.degreeRange?.min,
|
|
57
|
+
maxDegreeCap: config.degreeRange?.max ?? config.degreeRange?.maxDegreeCap,
|
|
58
|
+
});
|
|
59
|
+
const filtered = [];
|
|
60
|
+
const allEntityNeighbors = [];
|
|
61
|
+
graph.forEachNeighbor(nodeId, (neighbor) => {
|
|
62
|
+
if (graph.getNodeAttributes(neighbor).type !== 'entity')
|
|
63
|
+
return;
|
|
64
|
+
allEntityNeighbors.push(neighbor);
|
|
65
|
+
const deg = getEntityDegree(graph, neighbor);
|
|
66
|
+
if (deg >= range.min && deg <= range.max) {
|
|
67
|
+
filtered.push(neighbor);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
// Fallback: if degree range filtered everything out, use all entity neighbors
|
|
71
|
+
// This is common for very small graphs where the adaptive range is too tight
|
|
72
|
+
return filtered.length > 0 ? filtered : allEntityNeighbors;
|
|
73
|
+
}
|
|
74
|
+
/** Get unvisited entity neighbors, preferring degree-filtered ones but falling
|
|
75
|
+
* back to all when the filtered set is empty or all-filtered are already visited. */
|
|
76
|
+
function getNextEntityNeighbors(graph, nodeId, config, visited) {
|
|
77
|
+
const preferred = degreeFilteredNeighbors(graph, nodeId, config);
|
|
78
|
+
const unvisitedPreferred = preferred.filter(n => !visited.has(n));
|
|
79
|
+
if (unvisitedPreferred.length > 0)
|
|
80
|
+
return unvisitedPreferred;
|
|
81
|
+
// All preferred neighbors are visited — try all entity neighbors
|
|
82
|
+
const all = [];
|
|
83
|
+
graph.forEachNeighbor(nodeId, (neighbor) => {
|
|
84
|
+
if (graph.getNodeAttributes(neighbor).type !== 'entity' && !visited.has(neighbor))
|
|
85
|
+
return;
|
|
86
|
+
if (!visited.has(neighbor))
|
|
87
|
+
all.push(neighbor);
|
|
88
|
+
});
|
|
89
|
+
return all;
|
|
90
|
+
}
|
|
91
|
+
// ── augmented_chain ───────────────────────────────────────────────
|
|
92
|
+
/**
|
|
93
|
+
* Walk a sequential chain from seed entity, picking the highest-degree
|
|
94
|
+
* neighbor at each hop. Enrich each node with degree and score.
|
|
95
|
+
* Good for multi-hop reasoning questions.
|
|
96
|
+
*/
|
|
97
|
+
function sampleAugmentedChain(graph, config) {
|
|
98
|
+
const visited = new Set();
|
|
99
|
+
const entityOrder = [];
|
|
100
|
+
const maxHops = config.maxHops;
|
|
101
|
+
let current = config.seedEntities[0];
|
|
102
|
+
if (!current || !graph.hasNode(current)) {
|
|
103
|
+
return { strategy: 'augmented_chain', entities: [], edges: [], hopsCovered: 0, metadata: { reason: 'no_valid_seed' } };
|
|
104
|
+
}
|
|
105
|
+
visited.add(current);
|
|
106
|
+
entityOrder.push(current);
|
|
107
|
+
let hops = 0;
|
|
108
|
+
while (hops < maxHops) {
|
|
109
|
+
const neighbors = getNextEntityNeighbors(graph, current, config, visited);
|
|
110
|
+
if (neighbors.length === 0)
|
|
111
|
+
break;
|
|
112
|
+
// Pick the highest-degree neighbor
|
|
113
|
+
neighbors.sort((a, b) => getEntityDegree(graph, b) - getEntityDegree(graph, a));
|
|
114
|
+
const next = neighbors[0];
|
|
115
|
+
visited.add(next);
|
|
116
|
+
entityOrder.push(next);
|
|
117
|
+
current = next;
|
|
118
|
+
hops++;
|
|
119
|
+
}
|
|
120
|
+
const nodeSet = new Set(entityOrder);
|
|
121
|
+
const edges = collectAllEdgesBetween(graph, nodeSet);
|
|
122
|
+
return {
|
|
123
|
+
strategy: 'augmented_chain',
|
|
124
|
+
entities: entityOrder.map(id => toSampledEntity(graph, id)),
|
|
125
|
+
edges,
|
|
126
|
+
hopsCovered: hops,
|
|
127
|
+
metadata: { chainLength: entityOrder.length },
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// ── dual_core_bridge ──────────────────────────────────────────────
|
|
131
|
+
/**
|
|
132
|
+
* Given two seed entities, find if they converge on a shared target entity.
|
|
133
|
+
* Good for comparative analysis (e.g., "tokio vs async-std").
|
|
134
|
+
*/
|
|
135
|
+
function sampleDualCoreBridge(graph, config) {
|
|
136
|
+
const seeds = config.seedEntities.slice(0, 2);
|
|
137
|
+
const validSeeds = seeds.filter(s => graph.hasNode(s));
|
|
138
|
+
if (validSeeds.length < 2) {
|
|
139
|
+
return { strategy: 'dual_core_bridge', entities: [], edges: [], hopsCovered: 0, metadata: { reason: 'need_two_seeds' } };
|
|
140
|
+
}
|
|
141
|
+
const [seed1, seed2] = validSeeds;
|
|
142
|
+
const maxHops = config.maxHops;
|
|
143
|
+
// BFS from each seed, collecting reachable entity nodes within maxHops
|
|
144
|
+
function bfsReachable(start) {
|
|
145
|
+
const dist = new Map();
|
|
146
|
+
const queue = [{ id: start, d: 0 }];
|
|
147
|
+
dist.set(start, 0);
|
|
148
|
+
while (queue.length > 0) {
|
|
149
|
+
const { id, d } = queue.shift();
|
|
150
|
+
if (d >= maxHops)
|
|
151
|
+
continue;
|
|
152
|
+
graph.forEachNeighbor(id, (neighbor) => {
|
|
153
|
+
if (dist.has(neighbor))
|
|
154
|
+
return;
|
|
155
|
+
if (graph.getNodeAttributes(neighbor).type !== 'entity')
|
|
156
|
+
return;
|
|
157
|
+
dist.set(neighbor, d + 1);
|
|
158
|
+
queue.push({ id: neighbor, d: d + 1 });
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return dist;
|
|
162
|
+
}
|
|
163
|
+
const reach1 = bfsReachable(seed1);
|
|
164
|
+
const reach2 = bfsReachable(seed2);
|
|
165
|
+
// Find convergence nodes: entities reachable from both seeds
|
|
166
|
+
const convergenceNodes = [];
|
|
167
|
+
for (const [nodeId, d1] of reach1) {
|
|
168
|
+
const d2 = reach2.get(nodeId);
|
|
169
|
+
if (d2 !== undefined && nodeId !== seed1 && nodeId !== seed2) {
|
|
170
|
+
convergenceNodes.push({ id: nodeId, totalDist: d1 + d2, dist1: d1, dist2: d2 });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
convergenceNodes.sort((a, b) => a.totalDist - b.totalDist);
|
|
174
|
+
if (convergenceNodes.length === 0) {
|
|
175
|
+
// No convergence: just return the two seeds with their direct neighbors
|
|
176
|
+
const nodeSet = new Set([seed1, seed2]);
|
|
177
|
+
const neighbors1 = degreeFilteredNeighbors(graph, seed1, config).slice(0, 3);
|
|
178
|
+
const neighbors2 = degreeFilteredNeighbors(graph, seed2, config).slice(0, 3);
|
|
179
|
+
for (const n of neighbors1)
|
|
180
|
+
nodeSet.add(n);
|
|
181
|
+
for (const n of neighbors2)
|
|
182
|
+
nodeSet.add(n);
|
|
183
|
+
return {
|
|
184
|
+
strategy: 'dual_core_bridge',
|
|
185
|
+
entities: Array.from(nodeSet).map(id => toSampledEntity(graph, id)),
|
|
186
|
+
edges: collectAllEdgesBetween(graph, nodeSet),
|
|
187
|
+
hopsCovered: 0,
|
|
188
|
+
metadata: { convergence: false, reason: 'no_shared_target' },
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// Trace shortest paths from each seed to the best convergence node
|
|
192
|
+
const bridgeNode = convergenceNodes[0];
|
|
193
|
+
const allNodes = new Set([seed1, seed2, bridgeNode.id]);
|
|
194
|
+
// Trace path seed1 → bridge
|
|
195
|
+
const path1 = tracePath(graph, seed1, bridgeNode.id, bridgeNode.dist1);
|
|
196
|
+
const path2 = tracePath(graph, seed2, bridgeNode.id, bridgeNode.dist2);
|
|
197
|
+
for (const n of path1)
|
|
198
|
+
allNodes.add(n);
|
|
199
|
+
for (const n of path2)
|
|
200
|
+
allNodes.add(n);
|
|
201
|
+
const edges = collectAllEdgesBetween(graph, allNodes);
|
|
202
|
+
const maxDist = Math.max(bridgeNode.dist1, bridgeNode.dist2);
|
|
203
|
+
return {
|
|
204
|
+
strategy: 'dual_core_bridge',
|
|
205
|
+
entities: Array.from(allNodes).map(id => toSampledEntity(graph, id)),
|
|
206
|
+
edges,
|
|
207
|
+
hopsCovered: maxDist,
|
|
208
|
+
metadata: {
|
|
209
|
+
convergence: true,
|
|
210
|
+
bridgeEntity: bridgeNode.id,
|
|
211
|
+
bridgeLabel: graph.getNodeAttributes(bridgeNode.id).label,
|
|
212
|
+
distFromSeed1: bridgeNode.dist1,
|
|
213
|
+
distFromSeed2: bridgeNode.dist2,
|
|
214
|
+
totalConvergencePoints: convergenceNodes.length,
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/** Trace a shortest path from start to target using BFS (entity-only). */
|
|
219
|
+
function tracePath(graph, start, target, maxDepth) {
|
|
220
|
+
const prev = new Map();
|
|
221
|
+
const visited = new Set([start]);
|
|
222
|
+
const queue = [{ id: start, d: 0 }];
|
|
223
|
+
while (queue.length > 0) {
|
|
224
|
+
const { id, d } = queue.shift();
|
|
225
|
+
if (id === target)
|
|
226
|
+
break;
|
|
227
|
+
if (d >= maxDepth)
|
|
228
|
+
continue;
|
|
229
|
+
graph.forEachNeighbor(id, (neighbor) => {
|
|
230
|
+
if (visited.has(neighbor))
|
|
231
|
+
return;
|
|
232
|
+
if (graph.getNodeAttributes(neighbor).type !== 'entity')
|
|
233
|
+
return;
|
|
234
|
+
visited.add(neighbor);
|
|
235
|
+
prev.set(neighbor, id);
|
|
236
|
+
queue.push({ id: neighbor, d: d + 1 });
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
// Reconstruct path
|
|
240
|
+
const path = [];
|
|
241
|
+
let cur = target;
|
|
242
|
+
while (cur && cur !== start) {
|
|
243
|
+
path.push(cur);
|
|
244
|
+
cur = prev.get(cur);
|
|
245
|
+
}
|
|
246
|
+
return path;
|
|
247
|
+
}
|
|
248
|
+
// ── community_core_path ───────────────────────────────────────────
|
|
249
|
+
/**
|
|
250
|
+
* High-degree hub entities at the center, paths radiating to peripheral entities.
|
|
251
|
+
* Useful for understanding the "backbone" of the knowledge graph.
|
|
252
|
+
*/
|
|
253
|
+
function sampleCommunityCorePath(graph, config) {
|
|
254
|
+
const range = adaptiveDegreeRange(graph, {
|
|
255
|
+
minDegree: config.degreeRange?.min,
|
|
256
|
+
maxDegreeCap: config.degreeRange?.max ?? config.degreeRange?.maxDegreeCap,
|
|
257
|
+
});
|
|
258
|
+
// Find hub entities within degree range
|
|
259
|
+
let allEntities = filterEntitiesByDegree(graph, {
|
|
260
|
+
minDegree: range.min,
|
|
261
|
+
maxDegreeCap: range.max,
|
|
262
|
+
});
|
|
263
|
+
// Fallback: if degree filtering removes everything, use all entities
|
|
264
|
+
if (allEntities.length === 0) {
|
|
265
|
+
const entities = [];
|
|
266
|
+
graph.forEachNode((node, attrs) => {
|
|
267
|
+
if (attrs.type === 'entity') {
|
|
268
|
+
entities.push({ id: node, degree: getEntityDegree(graph, node), label: attrs.label });
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
entities.sort((a, b) => b.degree - a.degree);
|
|
272
|
+
allEntities = entities;
|
|
273
|
+
}
|
|
274
|
+
if (allEntities.length === 0) {
|
|
275
|
+
return { strategy: 'community_core_path', entities: [], edges: [], hopsCovered: 0, metadata: { reason: 'no_entities' } };
|
|
276
|
+
}
|
|
277
|
+
// Top hub: highest-degree entity (or seed if provided)
|
|
278
|
+
let hubId = allEntities[0].id;
|
|
279
|
+
if (config.seedEntities.length > 0 && graph.hasNode(config.seedEntities[0])) {
|
|
280
|
+
hubId = config.seedEntities[0];
|
|
281
|
+
}
|
|
282
|
+
// Collect hub and its neighbors within maxHops
|
|
283
|
+
// Use degreeFilteredNeighbors with fallback for each step
|
|
284
|
+
const visited = new Set();
|
|
285
|
+
const nodeSet = new Set();
|
|
286
|
+
const queue = [{ id: hubId, d: 0 }];
|
|
287
|
+
visited.add(hubId);
|
|
288
|
+
while (queue.length > 0) {
|
|
289
|
+
const { id, d } = queue.shift();
|
|
290
|
+
if (d > config.maxHops)
|
|
291
|
+
continue;
|
|
292
|
+
const attrs = graph.getNodeAttributes(id);
|
|
293
|
+
if (attrs.type === 'entity')
|
|
294
|
+
nodeSet.add(id);
|
|
295
|
+
// Use getNextEntityNeighbors for consistent fallback behavior
|
|
296
|
+
const visitedSet = visited;
|
|
297
|
+
graph.forEachNeighbor(id, (neighbor) => {
|
|
298
|
+
if (visited.has(neighbor))
|
|
299
|
+
return;
|
|
300
|
+
if (graph.getNodeAttributes(neighbor).type !== 'entity')
|
|
301
|
+
return;
|
|
302
|
+
visited.add(neighbor);
|
|
303
|
+
queue.push({ id: neighbor, d: d + 1 });
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
const edges = collectAllEdgesBetween(graph, nodeSet);
|
|
307
|
+
return {
|
|
308
|
+
strategy: 'community_core_path',
|
|
309
|
+
entities: Array.from(nodeSet).map(id => toSampledEntity(graph, id)),
|
|
310
|
+
edges,
|
|
311
|
+
hopsCovered: Math.min(config.maxHops, ...Array.from(nodeSet).map(id => {
|
|
312
|
+
// BFS distance from hub
|
|
313
|
+
const visited2 = new Set();
|
|
314
|
+
const q = [{ n: hubId, d: 0 }];
|
|
315
|
+
visited2.add(hubId);
|
|
316
|
+
while (q.length > 0) {
|
|
317
|
+
const { n, d } = q.shift();
|
|
318
|
+
if (n === id)
|
|
319
|
+
return d;
|
|
320
|
+
graph.forEachNeighbor(n, (nb) => {
|
|
321
|
+
if (!visited2.has(nb) && nodeSet.has(nb)) {
|
|
322
|
+
visited2.add(nb);
|
|
323
|
+
q.push({ n: nb, d: d + 1 });
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
return config.maxHops;
|
|
328
|
+
})),
|
|
329
|
+
metadata: {
|
|
330
|
+
hubEntity: hubId,
|
|
331
|
+
hubLabel: graph.getNodeAttributes(hubId).label,
|
|
332
|
+
hubDegree: getEntityDegree(graph, hubId),
|
|
333
|
+
totalEntities: allEntities.length,
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
// ── deep_chain ────────────────────────────────────────────────────
|
|
338
|
+
/**
|
|
339
|
+
* Depth-limited DFS (max 5-8 hops), exploring the deepest reachable paths.
|
|
340
|
+
* Not NP-hard longest path — just a bounded DFS with cycle detection.
|
|
341
|
+
*/
|
|
342
|
+
function sampleDeepChain(graph, config) {
|
|
343
|
+
const start = config.seedEntities[0];
|
|
344
|
+
if (!start || !graph.hasNode(start)) {
|
|
345
|
+
return { strategy: 'deep_chain', entities: [], edges: [], hopsCovered: 0, metadata: { reason: 'no_valid_seed' } };
|
|
346
|
+
}
|
|
347
|
+
const maxHops = Math.min(config.maxHops, 8); // hard cap at 8
|
|
348
|
+
// DFS tracking the deepest path found
|
|
349
|
+
let bestPath = [start];
|
|
350
|
+
function dfs(current, path, visited) {
|
|
351
|
+
if (path.length > bestPath.length) {
|
|
352
|
+
bestPath = [...path];
|
|
353
|
+
}
|
|
354
|
+
if (path.length - 1 >= maxHops)
|
|
355
|
+
return;
|
|
356
|
+
const neighbors = getNextEntityNeighbors(graph, current, config, visited);
|
|
357
|
+
for (const next of neighbors) {
|
|
358
|
+
visited.add(next);
|
|
359
|
+
path.push(next);
|
|
360
|
+
dfs(next, path, visited);
|
|
361
|
+
path.pop();
|
|
362
|
+
visited.delete(next);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
const visited = new Set([start]);
|
|
366
|
+
dfs(start, [start], visited);
|
|
367
|
+
const nodeSet = new Set(bestPath);
|
|
368
|
+
const edges = collectAllEdgesBetween(graph, nodeSet);
|
|
369
|
+
return {
|
|
370
|
+
strategy: 'deep_chain',
|
|
371
|
+
entities: bestPath.map(id => toSampledEntity(graph, id)),
|
|
372
|
+
edges,
|
|
373
|
+
hopsCovered: bestPath.length - 1,
|
|
374
|
+
metadata: { chainLength: bestPath.length },
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
// ── mixed ─────────────────────────────────────────────────────────
|
|
378
|
+
/** Randomly pick one of the concrete strategies. */
|
|
379
|
+
function sampleMixed(graph, config) {
|
|
380
|
+
const strategies = [
|
|
381
|
+
'augmented_chain',
|
|
382
|
+
'dual_core_bridge',
|
|
383
|
+
'community_core_path',
|
|
384
|
+
'deep_chain',
|
|
385
|
+
];
|
|
386
|
+
const rng = mulberry32(config.rngSeed ?? 42);
|
|
387
|
+
const idx = Math.floor(rng() * strategies.length);
|
|
388
|
+
const chosen = strategies[idx];
|
|
389
|
+
return sampleGraph(graph, { ...config, strategy: chosen });
|
|
390
|
+
}
|
|
391
|
+
// ── Main dispatch ─────────────────────────────────────────────────
|
|
392
|
+
/** Sample a knowledge graph using the specified strategy. */
|
|
393
|
+
export function sampleGraph(graph, config) {
|
|
394
|
+
switch (config.strategy) {
|
|
395
|
+
case 'augmented_chain':
|
|
396
|
+
return sampleAugmentedChain(graph, config);
|
|
397
|
+
case 'dual_core_bridge':
|
|
398
|
+
return sampleDualCoreBridge(graph, config);
|
|
399
|
+
case 'community_core_path':
|
|
400
|
+
return sampleCommunityCorePath(graph, config);
|
|
401
|
+
case 'deep_chain':
|
|
402
|
+
return sampleDeepChain(graph, config);
|
|
403
|
+
case 'mixed':
|
|
404
|
+
return sampleMixed(graph, config);
|
|
405
|
+
default:
|
|
406
|
+
return { strategy: config.strategy, entities: [], edges: [], hopsCovered: 0, metadata: { reason: 'unknown_strategy' } };
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=graph-sampling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-sampling.js","sourceRoot":"","sources":["../../src/deep/graph-sampling.ts"],"names":[],"mappings":"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"}
|
package/dist/deep/graph.d.ts
CHANGED
|
@@ -9,17 +9,36 @@
|
|
|
9
9
|
* The CLI only stores what the Agent sends via graph-add.
|
|
10
10
|
*/
|
|
11
11
|
import { DirectedGraph } from 'graphology';
|
|
12
|
+
/** Semantic edge relation types */
|
|
13
|
+
export declare const EDGE_RELATIONS: {
|
|
14
|
+
readonly yields: "yields";
|
|
15
|
+
readonly belongs_to: "belongs_to";
|
|
16
|
+
readonly mentions: "mentions";
|
|
17
|
+
readonly alternative_to: "alternative_to";
|
|
18
|
+
readonly depends_on: "depends_on";
|
|
19
|
+
readonly co_occurs_with: "co_occurs_with";
|
|
20
|
+
readonly mentioned_in: "mentioned_in";
|
|
21
|
+
readonly includes: "includes";
|
|
22
|
+
};
|
|
23
|
+
export type PathType = 'composition_chain' | 'conjunction' | 'augmented_chain' | 'community_core_path' | 'dual_core_bridge';
|
|
12
24
|
export interface GraphNodeAttrs {
|
|
13
|
-
type: 'entity' | 'result' | 'query' | 'domain';
|
|
25
|
+
type: 'entity' | 'result' | 'query' | 'domain' | 'path';
|
|
14
26
|
label: string;
|
|
15
27
|
entityType?: string;
|
|
16
28
|
score?: number;
|
|
29
|
+
reasoningPaths?: string[];
|
|
30
|
+
sourceRounds?: number[];
|
|
31
|
+
frequency?: number;
|
|
32
|
+
obfuscatedLabel?: string;
|
|
17
33
|
url?: string;
|
|
18
34
|
rank?: number;
|
|
19
35
|
title?: string;
|
|
20
36
|
query?: string;
|
|
21
37
|
round?: number;
|
|
22
38
|
domain?: string;
|
|
39
|
+
pathType?: PathType;
|
|
40
|
+
hops?: number;
|
|
41
|
+
entities?: string[];
|
|
23
42
|
}
|
|
24
43
|
export interface GraphEdgeAttrs {
|
|
25
44
|
relation: string;
|
|
@@ -35,6 +54,9 @@ export declare function resultId(url: string): string;
|
|
|
35
54
|
export declare function queryId(query: string): string;
|
|
36
55
|
/** Generate a node ID for a domain */
|
|
37
56
|
export declare function domainId(domain: string): string;
|
|
57
|
+
/** Generate the next path node ID for a given path type.
|
|
58
|
+
* Scans existing graph nodes to find the current max counter. */
|
|
59
|
+
export declare function nextPathId(graph: DirectedGraph<GraphNodeAttrs, GraphEdgeAttrs>, pathType: PathType): string;
|
|
38
60
|
/** Auto-build structural edges: query→result→domain */
|
|
39
61
|
export declare function buildStructuralEdges(graph: DirectedGraph<GraphNodeAttrs, GraphEdgeAttrs>, query: string, results: Array<{
|
|
40
62
|
url: string;
|
|
@@ -51,5 +73,6 @@ export declare function graphStats(graph: DirectedGraph<GraphNodeAttrs, GraphEdg
|
|
|
51
73
|
results: number;
|
|
52
74
|
queries: number;
|
|
53
75
|
domains: number;
|
|
76
|
+
paths: number;
|
|
54
77
|
};
|
|
55
78
|
//# sourceMappingURL=graph.d.ts.map
|
package/dist/deep/graph.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/deep/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/deep/graph.ts"],"names":[],"mappings":"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"}
|
package/dist/deep/graph.js
CHANGED
|
@@ -9,6 +9,17 @@
|
|
|
9
9
|
* The CLI only stores what the Agent sends via graph-add.
|
|
10
10
|
*/
|
|
11
11
|
import { DirectedGraph } from 'graphology';
|
|
12
|
+
/** Semantic edge relation types */
|
|
13
|
+
export const EDGE_RELATIONS = {
|
|
14
|
+
yields: 'yields', // query → result
|
|
15
|
+
belongs_to: 'belongs_to', // result → domain
|
|
16
|
+
mentions: 'mentions', // result → entity
|
|
17
|
+
alternative_to: 'alternative_to', // entity ↔ entity
|
|
18
|
+
depends_on: 'depends_on', // entity → entity
|
|
19
|
+
co_occurs_with: 'co_occurs_with', // entity ↔ entity
|
|
20
|
+
mentioned_in: 'mentioned_in', // entity → result
|
|
21
|
+
includes: 'includes', // path → entity
|
|
22
|
+
};
|
|
12
23
|
function generateId(prefix, value) {
|
|
13
24
|
return `${prefix}:${value.toLowerCase().replace(/[^\w]+/g, '_').slice(0, 60)}`;
|
|
14
25
|
}
|
|
@@ -32,6 +43,33 @@ export function queryId(query) {
|
|
|
32
43
|
export function domainId(domain) {
|
|
33
44
|
return generateId('d', domain);
|
|
34
45
|
}
|
|
46
|
+
/** Map from PathType to ID prefix */
|
|
47
|
+
const PATH_TYPE_PREFIX = {
|
|
48
|
+
composition_chain: 'chain',
|
|
49
|
+
conjunction: 'conj',
|
|
50
|
+
augmented_chain: 'aug',
|
|
51
|
+
community_core_path: 'core',
|
|
52
|
+
dual_core_bridge: 'bridge',
|
|
53
|
+
};
|
|
54
|
+
/** Generate the next path node ID for a given path type.
|
|
55
|
+
* Scans existing graph nodes to find the current max counter. */
|
|
56
|
+
export function nextPathId(graph, pathType) {
|
|
57
|
+
const prefix = PATH_TYPE_PREFIX[pathType];
|
|
58
|
+
let maxCounter = 0;
|
|
59
|
+
graph.forEachNode((node, attrs) => {
|
|
60
|
+
if (attrs.type === 'path' && attrs.pathType === pathType) {
|
|
61
|
+
// Extract counter from node ID: p:<prefix>_NNN
|
|
62
|
+
const match = node.match(new RegExp(`^p:${prefix}_(\\d+)$`));
|
|
63
|
+
if (match) {
|
|
64
|
+
const counter = parseInt(match[1], 10);
|
|
65
|
+
if (counter > maxCounter)
|
|
66
|
+
maxCounter = counter;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const next = maxCounter + 1;
|
|
71
|
+
return `p:${prefix}_${String(next).padStart(3, '0')}`;
|
|
72
|
+
}
|
|
35
73
|
/** Extract domain from URL */
|
|
36
74
|
function extractDomain(url) {
|
|
37
75
|
try {
|
|
@@ -130,7 +168,7 @@ export function deserializeGraph(data) {
|
|
|
130
168
|
return graph;
|
|
131
169
|
}
|
|
132
170
|
export function graphStats(graph) {
|
|
133
|
-
let entities = 0, results = 0, queries = 0, domains = 0;
|
|
171
|
+
let entities = 0, results = 0, queries = 0, domains = 0, paths = 0;
|
|
134
172
|
graph.forEachNode((node, attrs) => {
|
|
135
173
|
if (attrs.type === 'entity')
|
|
136
174
|
entities++;
|
|
@@ -140,6 +178,8 @@ export function graphStats(graph) {
|
|
|
140
178
|
queries++;
|
|
141
179
|
else if (attrs.type === 'domain')
|
|
142
180
|
domains++;
|
|
181
|
+
else if (attrs.type === 'path')
|
|
182
|
+
paths++;
|
|
143
183
|
});
|
|
144
184
|
return {
|
|
145
185
|
nodes: graph.order,
|
|
@@ -148,6 +188,7 @@ export function graphStats(graph) {
|
|
|
148
188
|
results,
|
|
149
189
|
queries,
|
|
150
190
|
domains,
|
|
191
|
+
paths,
|
|
151
192
|
};
|
|
152
193
|
}
|
|
153
194
|
//# sourceMappingURL=graph.js.map
|
package/dist/deep/graph.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/deep/graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/deep/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified interface for all deep search iteration data commands.
|
|
3
|
+
*
|
|
4
|
+
* Composes the individual data modules into a single analysis call:
|
|
5
|
+
* - checkQueryRedundancy
|
|
6
|
+
* - assessResultQuality
|
|
7
|
+
* - generateQuerySuggestions
|
|
8
|
+
* - analyzeRecoveryOptions
|
|
9
|
+
* - getStrategyInfo
|
|
10
|
+
*
|
|
11
|
+
* Agent can call getSessionAnalysis() to get a comprehensive snapshot
|
|
12
|
+
* of the session state for decision-making.
|
|
13
|
+
*/
|
|
14
|
+
import { DirectedGraph } from 'graphology';
|
|
15
|
+
import { GraphNodeAttrs, GraphEdgeAttrs } from './graph.js';
|
|
16
|
+
import { SessionResult } from './session.js';
|
|
17
|
+
import { QualityScore, QualityThresholds } from './quality-assess.js';
|
|
18
|
+
import { QuerySuggestionData } from './query-suggest.js';
|
|
19
|
+
import { StrategyConfig, StrategyInfo } from './search-strategy.js';
|
|
20
|
+
import { RecoveryAnalysis } from './recovery-analysis.js';
|
|
21
|
+
import { RedundancyConfig, RedundancyResult } from './query-redundancy.js';
|
|
22
|
+
export interface SessionAnalysis {
|
|
23
|
+
quality: QualityScore;
|
|
24
|
+
strategy: StrategyInfo;
|
|
25
|
+
suggestions: QuerySuggestionData;
|
|
26
|
+
recovery: RecoveryAnalysis;
|
|
27
|
+
}
|
|
28
|
+
/** Get a comprehensive analysis of the current session state.
|
|
29
|
+
* Combines quality assessment, strategy info, query suggestions,
|
|
30
|
+
* and recovery analysis into a single output for Agent decision-making. */
|
|
31
|
+
export declare function getSessionAnalysis(graph: DirectedGraph<GraphNodeAttrs, GraphEdgeAttrs>, sessionResults: SessionResult[], options?: {
|
|
32
|
+
qualityThresholds?: Partial<QualityThresholds>;
|
|
33
|
+
strategyConfig?: Partial<StrategyConfig>;
|
|
34
|
+
}): SessionAnalysis;
|
|
35
|
+
/** Check a new query for redundancy before execution.
|
|
36
|
+
* Standalone convenience function — also available via query-redundancy.ts. */
|
|
37
|
+
export declare function checkNewQueryRedundancy(newQuery: string, graph: DirectedGraph<GraphNodeAttrs, GraphEdgeAttrs>, config?: Partial<RedundancyConfig>): RedundancyResult;
|
|
38
|
+
//# sourceMappingURL=iteration-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iteration-data.d.ts","sourceRoot":"","sources":["../../src/deep/iteration-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAuB,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAyC,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAA0B,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAwB,MAAM,uBAAuB,CAAC;AAIjG,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,mBAAmB,CAAC;IACjC,QAAQ,EAAE,gBAAgB,CAAC;CAC9B;AAID;;4EAE4E;AAC5E,wBAAgB,kBAAkB,CAC9B,KAAK,EAAE,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC,EACpD,cAAc,EAAE,aAAa,EAAE,EAC/B,OAAO,CAAC,EAAE;IACN,iBAAiB,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5C,GACF,eAAe,CA6BjB;AAED;gFACgF;AAChF,wBAAgB,uBAAuB,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC,EACpD,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GACnC,gBAAgB,CAYlB"}
|